刚学模拟退火,贺的第一篇,为啥这都能寄啊/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;
}