【BZOJ3680】吊打XXX 广义费马点 模拟退火

#include <stdio.h>
int main()
{
	puts("转载请注明出处[vmurder]谢谢");
	puts("网址:blog.csdn.net/vmurder/article/details/43526909");
}

!!!其实我脸一点也不黑!我天天洗脸的!

题解:

我的姿势是先模拟退火,然后少少爬下山来取优。

参数什么的看代码就好。

那个种子的生成方式是[生日^名字首字母的hash]

代码:

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define N 10100
#define inf 23333333333333333ll
#define eps 1e-3
#define down 0.993
using namespace std;
double ln,rn,lm,rm;
struct Point // 点
{
	double x,y,z; // 坐标、该点作为结束点的答案。
	Point(double _x=0.0,double _y=0.0):x(_x),y(_y){}
	bool in()
	{
		if(x<ln||x>rn)return 0;
		if(y<lm||y>rm)return 0;
		return 1;
	}
}P[N],now,ans;
int p;
inline double Rand(){return ((double)(rand()%1000+1.0))/1000.0;}
inline void init()
{
	double tempx=0.0,tempy=0.0;
	for(int i=1;i<=p;i++)
	{
		tempx+=P[i].x,tempy+=P[i].y;
		ln=min(P[i].x,ln),rn=max(P[i].x,rn);
		lm=min(P[i].y,lm),rm=max(P[i].y,rm);
	}
	now=Point(tempx/p,tempy/p);
	ans.z=inf;
}
inline double calc(const Point &a,const Point &b)
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline double Calc(Point &a)
{
	a.z=0.0;
	for(int i=1;i<=p;i++)a.z+=calc(P[i],a)*P[i].z;
	if(a.z<ans.z)ans=a;
	return a.z;
}
Point newpos(double T,const Point &a)
{
	double alp=2.0*acos(-1.0)*Rand();
	return Point(a.x+T*cos(alp)*Rand(),a.y+T*sin(alp)*Rand());
}
void Std_Anne(double T=sqrt((rn-ln)*(rn-ln)+(rm-lm)*(rm-lm))*0.3)
{
	for(;T>eps;T*=down)
	{
		Point next=newpos(T,now);
		if(next.in())
		{
			double dis=Calc(now)-Calc(next);
			if(exp(dis/T)>=Rand())now=next;
		}
	}
}
void ioi()
{
	for(int i=1;i<=1000;i++)
	{
		Point next=newpos(0.001,ans);
		if(next.in())
		{
			double dis=Calc(next)-Calc(now);
			if(dis>0)now=next;
		}
	}
}
int main()
{
	freopen("test.in","r",stdin);
	srand(20134858);
	scanf("%d",&p);
	for(int i=1;i<=p;i++)scanf("%lf%lf%lf",&P[i].x,&P[i].y,&P[i].z);
	init();
	Std_Anne(1000000.0);
	ioi();
	printf("%.3lf %.3lf\n",ans.x,ans.y);
	return 0;
}
时间: 2024-11-10 08:53:24

【BZOJ3680】吊打XXX 广义费马点 模拟退火的相关文章

bzoj3680: 吊打XXX(模拟退火)

题目要求 最小(dis表示绳结到点i的距离),就是个广义费马点的题,模拟退火裸题QAQ 模拟退火就是优化后的爬山算法,一开始先随机一个平均点,接下来如果随机到的点比当前点劣,温度比较高的话也有几率跳过去,这样就能跳出一个局部最优解,随着温度降低,跳到劣点的概率越来越小 好喵喵的算法! (这题好像黄学长直接爬山算法也过了,模拟退火贼慢T^T #include<iostream> #include<cstring> #include<cstdlib> #include<

bzoj3680 吊打XXX

Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助.不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. Input 输入第一行为一个正整数n(1<=n<=10000),

【BZOJ3680】吊打XXX 模拟退火

[BZOJ3680]吊打XXX Description gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty.gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了.蒟蒻们将n个gty吊在n根绳子上,每根绳子穿过天台的一个洞.这n根绳子有一个公共的绳结x.吊好gty后蒟蒻们发现由于每个gty重力不同,绳结x在移动.蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助.不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上. Input 输入第一行为一个正整数

【BZOJ3680】吊打XXX(模拟退火)

[BZOJ3680]吊打XXX(模拟退火) 题面 BZOJ 题解 模拟退火... 就是模拟退火 然后这题有毒 各种调参数之后终于\(AC\)了.. 这种题就是玄学呀... 温度要调大 最后跑完还要向四周多\(rand\)几次 保证能够找到最优解... #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<

hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)

题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                         (全题文末) 知识点: 整数n有种和分解方法. 费马小定理:p是质数,若p不能整除a,则 a^(p-1) ≡1(mod p).可利用费马小定理降素数幂. 当m为素数,(m必须是素数才能用费马小定理) a=2时.(a=2只是题中条件,a可以为其他值) mod m =  *      //  k=

HDU 1098 Ignatius&#39;s puzzle 费马小定理+扩展欧几里德算法

题目大意: 给定k,找到一个满足的a使任意的x都满足 f(x)=5*x^13+13*x^5+k*a*x 被65整除 推证: f(x) = (5*x^12 + 13 * x^4 + ak) * x 因为x可以任意取 那么不能总是满足 65|x 那么必须是 65 | (5*x^12 + 13 * x^4 + ak) 那么就是说 x^12 / 13 + x^4 / 5 + ak / 65 正好是一个整数 假设能找到满足的a , 那么将 ak / 65 分进x^12 / 13 + x^4 / 5中得到

【Lucas定理/费马小定理/中国剩余定理/扩展欧几里得】[BZOJ 1951] 古代猪文

[Description] 求 [Solution] 容易得到, 所以,重点在怎么求 如果是p-1是个质数,我们可以用sqrt(n)的时间枚举所有d,用Lucas定理分别计算求和即可. 但是我们发现p-1=2*3*4679*35617,并不是一个质数,所以Lucas定理不能用了吗?并不,我们可以算出这个合式分别对2.3.4679.35617的模值,写出四个同余方程,再用孙子定理求解即可.注意特判g==p的情况,此时费马小定理不成立,ans=0. [Code] #include<cmath> #

poj1379+POJ2420+hdu3932(最短距离+费马点+模拟淬火算法)

Run Away Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 5632   Accepted: 1729 Description One of the traps we will encounter in the Pyramid is located in the Large Room. A lot of small holes are drilled into the floor. They look complet

hdu 4549 (矩阵快速幂+费马小定理)

题意:已知F0=a,F1=b,Fn=Fn-1*Fn-2,给你a,b,n求Fn%1000000007的值 思路:我们试着写几组数 F0=a F1=b F2=a*b F3=a*b2 F4=a2*b3 F5=a3*b5 我们发现a,b的系数其实是斐波那契数列,我们只需用矩阵快速幂求出相应系数就行,但是 这个系数随着增长会特别大,这时我们需要利用费马小定理进行降幂处理 费马小定理 ap-1≡1(mod p) 代码: #include <iostream> #include <cmath>