模拟退火入门题
代码
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#define INF 0x7fffffff
using namespace std;
int n;
const double t=0.98;
const double eps=1e-8;
const int dx[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};
struct node
{
double x,y;
};
node d[110];
double dis(double x,double y)
{
double ans=0;
for(int i=0; i<n; i++)
ans+=sqrt(fabs((x-d[i].x)*(x-d[i].x)+(y-d[i].y)*(y-d[i].y)));
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%lf%lf",&d[i].x,&d[i].y);
double ans=INF;
double x=0,y=0;
double step=100;
while(step>eps)
{
int flag=1;
while(flag)
{
flag=0;
for(int i=0; i<4; i++)
{
double next_x=x+dx[i][0]*step;
double next_y=y+dx[i][1]*step;
if(next_x<0||next_x>10000) continue;
if(next_y<0||next_y>10000) continue;
double tmp=dis(next_x,next_y);
if(tmp<ans)
{
ans=tmp;
x=next_x;
y=next_y;
flag=1;
}
}
}
step*=t;
}
printf("%.0f\n",ans);
return 0;
}