模拟退火模板
输出用%.0f不要用%.0lf
WA一下午
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#define N 105
using namespace std;
typedef double db;
int n;
db x[N],y[N];
db qp(db x) {return x*x;}
db dis(db x1,db y1,db x2,db y2) {return sqrt(qp(x1-x2)+qp(y1-y2));}
db sumdis(db sx,db sy) {
db ret = 0;
for (int i=1;i<=n;i++) ret += dis(sx,sy,x[i],y[i]);
return ret;
}
int main() {
srand(19930726);
while (~scanf("%d",&n)) {
for (int i=1;i<=n;i++) scanf("%lf%lf",&x[i],&y[i]);
db xx=x[1],yy=y[1],ans=sumdis(xx,yy);
for (db T=100000;T>1e-10;T*=0.99) {
db d = rand();
db nx = xx + T * cos(d);
db ny = yy + T * sin(d);
db cur = sumdis(nx, ny);
if (cur < ans)
ans = cur, xx = nx, yy = ny;
else {
if (exp((cur-ans)/T) < (rand()%10000)/10000.0) {
ans = cur;
xx = nx, yy = ny;
}
}
}
printf("%.0f\n",ans);
}
return 0;
}