退火wa30遍,qaq
查看原帖
退火wa30遍,qaq
226944
光锥xn楼主2021/4/18 16:37
#include<bits/stdc++.h>
//#define double long double
#define mc 0.996
using namespace std;
int n;
double ansx,ansy,ans;
struct wa{
	int x,y,w;
}a[2005];
inline int read()
{
	int x=0,f=1;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(; isdigit(c);c=getchar())x=(x<<3)+(x<<1)+c-'0';
	return x*f;
}
double hhh(double x,double y)
{
	double em,dx,dy;
	for(register int i=1;i<=n;i++){
		dx=x-a[i].x,dy=y-a[i].y;
		em+=(double)(sqrt(dx*dx+dy*dy)*a[i].w);
	}
	return em;
}
void fire()
{
	double ex,ey,ea,de,t=2021;
	while(t>1e-15){
		ex=ansx+((rand()<<1)-RAND_MAX)*t;
		ey=ansy+((rand()<<1)-RAND_MAX)*t;
		ea=hhh(ex,ey);
		de=ea-ans;
		if(de<0){ansx=ex,ansy=ey,ans=ea;}
		else if(exp(-de/t)*RAND_MAX>rand()){ansx=ex,ansy=ey;}
		t*=mc;
	}
}
void sa()
{
	fire();fire();fire();
    fire();
    fire();
}
int main()
{
	register int i;
	n=read();
	//scanf("%d",&n);
	srand(time(0));
	for(i=1;i<=n;i++){
		a[i].x=read(),a[i].y=read(),a[i].w=read();
		//scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].w);
		ansx+=a[i].x,ansy+=a[i].y;
	}
	ansx/=n,ansy/=n;
	ans=hhh(ansx,ansy);
	sa();
	printf("%.3lf %.3lf",ansx,ansy);
	return 0;
}

(long double用过也没过

求大佬

2021/4/18 16:37
加载中...