gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了。蒟蒻们将
n个gty吊在n根绳子上,每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于每个gty重力不同,绳
结x在移动。蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助。
不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上。
标签:geo 1.5 质量 ide out git 定向 题目 hid
gty又虐了一场比赛,被虐的蒟蒻们决定吊打gty。gty见大势不好机智的分出了n个分身,但还是被人多势众的蒟蒻抓住了。蒟蒻们将
n个gty吊在n根绳子上,每根绳子穿过天台的一个洞。这n根绳子有一个公共的绳结x。吊好gty后蒟蒻们发现由于每个gty重力不同,绳
结x在移动。蒟蒻wangxz脑洞大开的决定计算出x最后停留处的坐标,由于他太弱了决定向你求助。
不计摩擦,不计能量损失,由于gty足够矮所以不会掉到地上。
输入第一行为一个正整数n(1<=n<=10000),表示gty的数目。
接下来n行,每行三个整数xi,yi,wi,表示第i个gty的横坐标,纵坐标和重力。
对于20%的数据,gty排列成一条直线。
对于50%的数据,1<=n<=1000。
对于100%的数据,1<=n<=10000,-100000<=xi,yi<=100000
输出1行两个浮点数(保留到小数点后3位),表示最终x的横、纵坐标。
思路: 这个题目是我是用模拟题退火做的,模拟退火是一个很神奇的概率算法,关键是调参数和精度误差。
主要的思路:
膜你退火就是在膜你一个退火的过程,他和爬山的区别就在于,它多了一个温度参数。
我们可以发现,越到后面,我们就越接近。
所以我们应该把修改的范围越改越小,接受较劣解的可能性也应该调小。
于是我们引入一个温度变量T,膜你退火的过程,温度逐渐下降。
下面给出模拟退火的流程:
设定初始较高的温度T
while 温度>设定的最低值
随机得到一个新解(温度越高,新解与旧解的差异越大)
更新答案
根据新解与旧解之间的优劣关系,以一定概率接受新解(越优越有可能)
以一定方式降温
endwhile
为了保证答案的质量,我们可以在最优解附近再进行随机,并更新答案
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define RD T*(2*rand()-RAND_MAX) 4 #define gc() getchar() 5 #define R register int 6 #define rep(i,a,b) for(R i=a;i<=b;i++) 7 #define Rep(i,a,b) for(R i=a;i>=b;i--) 8 9 int const N=1000+3; 10 long double const D=0.97; 11 long double const eps=1e-14; 12 long double x[N],y[N],w[N]; 13 int n; 14 15 template<class T>void read(T &x){ 16 x=0; char c=0; int w=0; 17 while (!isdigit(c)) w|=c==‘-‘,c=gc(); 18 while (isdigit(c)) x=x*10+(c^48),c=gc(); 19 if(w) x=-x; 20 } 21 long double calc(long double vx,long double vy){ 22 long double ret=0; 23 rep(i,1,n) { 24 long double dx=vx-x[i]; 25 long double dy=vy-y[i]; 26 long double t=sqrt(dx*dx+dy*dy); 27 ret+=t*w[i]; 28 } 29 return ret; 30 } 31 int main(){ 32 long double T,x0,y0,x1,y1,res,ans,best,bx=0,by=0; 33 read(n); 34 rep(i,1,n){ 35 read(x[i]),read(y[i]),read(w[i]); 36 bx+=x[i]; by+=y[i]; 37 } 38 srand(time(0)); 39 bx/=n;by/=n; 40 best=ans=calc(bx,by); 41 int sum=1; 42 while (sum--){ 43 x0=bx;y0=by; ans=best; 44 for (T =100000; T>eps;T*=D){ 45 x1=x0+RD; y1=y0+RD; 46 long double tmp=calc(x1,y1); 47 if(best>tmp) best=tmp,bx=x1,by=y1; 48 if(ans>tmp || exp((ans-tmp)/T)>(long double)rand()/RAND_MAX) 49 ans=tmp,x0=x1,y0=y1; 50 } 51 } 52 printf("%0.3Lf %0.3Lf\n",bx,by); 53 return 0; 54 }
标签:geo 1.5 质量 ide out git 定向 题目 hid
原文地址:https://www.cnblogs.com/ZJXXCN/p/10248003.html