背景:
输出格式有坑
.
.
.
...
...
题目传送门:
https://www.luogu.org/problemnew/show/UVA10228
题意:
在给定顶点的
n
n
n边形选出一个点,使其到所有定点的距离和最小。
思路:
不还是普通的模拟退火吗?
详见:模拟退火。
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<ctime>
#define eps 1e-16
using namespace std;
int n;
double ans;
struct node{int x,y;} a[110];
double calc(double x,double y)
{
double sum=0;
for(int i=1;i<=n;i++)
sum+=sqrt((x-a[i].x)*(x-a[i].x)+(y-a[i].y)*(y-a[i].y));
return sum;
}
void fire()
{
double t=2000,ansx=0,ansy=0;
while(t>eps)
{
double nowx=ansx+(rand()*2-RAND_MAX)*t,nowy=ansy+(rand()*2-RAND_MAX)*t;
double now=calc(nowx,nowy),delta=calc(nowx,nowy)-ans;
if(delta<0||exp(-delta/t)*RAND_MAX>rand()) ans=now,ansx=nowx,ansy=nowy;
t*=0.999;
}
}
int main()
{
int T;
srand(time(0));
scanf("%d",&T);
while(T--)
{
ans=1e60;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d %d",&a[i].x,&a[i].y);
random_shuffle(a+1,a+n+1);
for(int i=1;i<=20;i++)
fire();
printf("%.0lf\n",ans);
if(T) printf("\n");
}
}