题目大意:在多边形中找一个点,让这个点距离所有点的距离和最短。
模拟退火,选一个随机点,朝上,下,左,右四个点移动
代码:
#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#define maxn 100+10
#define sqr(x) ((x)*(x))
#define F(i,n) for(int i=0;i<n;i++)
#define eps 1e-3
#define pi acos(-1.0)
#define Min(a,b) a>b?b:a
using namespace std;
int dr[4][2]={-1,0,0,-1,1,0,0,1};
struct cpoint{
double x,y,d;
cpoint()
{
d=0;
}
};
cpoint cp[maxn],rp;
int n;
double dis(cpoint p,cpoint q)
{
return sqrt(sqr(p.x-q.x)+sqr(p.y-q.y));
}
void solve()
{
rp=cp[0];
rp.d=0;
F(i,n)
rp.d+=dis(rp,cp[i]); //printf("rp :%lf\n",rp.d);
double dal=10000;
while(dal>0.2)
{
cpoint t;
F(j,4)
{
t.x=rp.x+dal*dr[j][0];
t.y=rp.y+dal*dr[j][1];
if(t.x>10000||t.x<0||t.y>10000||t.y<0)
continue;
t.d=0;
F(k,n)
{
t.d+=dis(t,cp[k]);
} //printf("d :%lf\n",t.d);
if(rp.d>t.d)
rp=t;
}
dal*=0.5;
}
printf("%d\n",(int)(rp.d+0.5)*100/100);
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
F(i,n)
scanf("%lf %lf",&cp[i].x,&cp[i].y);
solve();
}
return 0;
}