贺的题解,求助
查看原帖
贺的题解,求助
270120
xhQYm楼主2023/11/9 11:06

刚学模拟退火,贺的第一篇,为啥这都能寄啊/kk

谢谢大佬

#include<bits/stdc++.h>
#define db double
#define down 0.996
using namespace std;
const int N=2010;
int n; 
struct Nd{
	int x,y,w;
}d[N];
db ansx,ansy,answ;//答案
db calc(db x,db y){
	db r=0,dx,dy;
	for(int i=1;i<=n;i++){
		dx=x-d[i].x;
		dy=y-d[i].y;
		r+=sqrt(dx*dx+dy*dy)*d[i].w;
	}
	return r;
} 
void SA(){
	db t=3000;
	while(t>1e-15){
		db ex=ansx+t*(rand()*2-RAND_MAX);
		db ey=ansx+t*(rand()*2-RAND_MAX);
		db ew=calc(ex,ey);
		db de=ew-answ;//ew-answ<0 => ew<answ
		if(de<0){
			ansx=ex,ansy=ey;
			answ=ew;
		}
		else if(exp(-de/t)*RAND_MAX>rand()){
			ansx=ex;
			ansy=ey;
		}
		t*=down;
	}
}
signed main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d%d%d",&d[i].x,&d[i].y,&d[i].w);
		ansx+=d[i].x,ansy+=d[i].y;
	}
	ansx/=n;ansy/=n;
	answ=calc(ansx,ansy);
	SA();SA();SA();SA();
	printf("%.3lf %.3lf",ansx,ansy);
    return 0;
}
2023/11/9 11:06
加载中...