退火0pts求助(玄关)
查看原帖
退火0pts求助(玄关)
796838
Zak_chen楼主2023/9/28 17:52

TLE+WA

#include<bits/stdc++.h>
#define N 100005
#define down 0.996
#define eps 1e-15
#define double long double
using namespace std;
int n;
struct node{
	double x,y;
}a[N];
double ansx,ansy,ansr;
double calc(double x,double y)
{
	double ret = 0;
	for(int i=1;i<=n;i++)
	{
		double dx = x-a[i].x;
		double dy = y-a[i].y;
		double dis = sqrt(dx*dx+dy*dy);
		ret = max(ret,dis);
	}
	return ret;
}
void SA()
{
	double T=2500;
	while(T>eps)
	{
		double nex = ansx + (rand()*2-RAND_MAX)*T;
		double ney = ansy + (rand()*2-RAND_MAX)*T;
		double nw = calc(nex,ney);
		double delta = nw-ansr;
		if(delta<0)
		{
			ansx=nex; ansy=ney; ansr=nw;
		}
		else if(exp(-delta/T) * RAND_MAX > rand())
		{
			ansx=nex; ansy=ney;
		}
		T*=down;
	}
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%Lf%Lf",&a[i].x,&a[i].y);
		ansx += a[i].x;
		ansy += a[i].y;
	}
	ansx /= n; ansy /= n;
	ansr = calc(ansx,ansy);
//	printf("st = %lf\n",(double)clock());
	//while((double)clock()/CLOCKS_PER_SEC < 0.8) SA();
//	printf("ed = %lf\n",(double)clock());
	SA(); SA(); SA();
	printf("%.10Lf\n",ansr);
	printf("%.10Lf %.10Lf",ansx,ansy);
	return 0;
} 
2023/9/28 17:52
加载中...