模拟退火逼近
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <cmath>
using namespace std;
struct point
{
double x, y;
}sta[110];
double getdis(point a, point b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
double sumdis(point cir, int n)
{
double ans = 0;
for( int i = 0; i < n; i++)
ans += getdis(cir, sta[i]);
return ans;
}
point fermentpoint(int n)
{
point v, u;
u.x = 0, u.y = 0;
double step = 100.0;
double dist = sumdis(u, n);
int i, j, k;
while(step > 0.2)
{
bool ok = true;
while(ok)
{
ok =false;
for( int i = -1; i <= 1; i++)
for( int j = -1; j <= 1; j++)
{
v.x = u.x + step*i;
v.y = u.y + step*j;
double temp = sumdis(v, n);
if(temp < dist)
{
dist = temp;
ok = true;
u = v;
}
}
}
step /= 2.0;
}
return u;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
point u;
double tot = 0;
for( int i =0; i < n; i++)
scanf("%lf%lf",&sta[i].x, &sta[i].y);
point res = fermentpoint(n);
printf("%d\n",(int)(sumdis(res,n)+0.5)*100/100);
}
return 0;
}