膜你退火求条
查看原帖
膜你退火求条
788951
TLE_AK楼主2025/1/22 17:04
#include<bits/stdc++.h>
using namespace std;
#define dd long double

namespace acac
{
	int n;
	
	int read()
	{
		int ans=0,fs=1;
		char ch=getchar();
		while(ch<'0'||ch>'9')
		{
			if(ch=='-')fs*=-1;
			ch=getchar();
		}
		while(ch>='0'&&ch<='9')
		{
			ans=ans*10+ch-'0';
			ch=getchar();
		}
		return ans;
	}
	
	struct node
	{
		dd x,y,w;
	}A[1010];
	
	const dd alp=0.997;
	dd calc(dd x,dd y)
	{
		dd res=0;
		for(int i=1;i<=n;i++)
		{
			dd dx=x-A[i].x,dy=y-A[i].y;
			res+=sqrt(dx*dx+dy*dy)*A[i].w;
		}
		return res;
	}
	
	dd nx,ny,nw;
	dd ans,ax,ay;
	void sa()
	{
		dd t=1000000;
		ans=nw,ax=nx,ay=ny;
		while(t>1e-15)
		{
			dd ex=nx+t*(rand()*2-RAND_MAX),ey=ny+t*(rand()*2-RAND_MAX);
			dd ew=calc(ex,ey),da=nw-ew;
			if(ew<ans)ans=nw,ay=ey,ax=ex;
			if(nw>ew||exp(da/t)*(dd)RAND_MAX>(dd)rand())nw=ew,nx=ex,ny=ey;
			t*=alp;
		}		
	}  
	
	int main()
	{
		srand(22101);
		n=read();
		for(int i=1;i<=n;i++)
		{
			A[i].x=read();
			A[i].y=read();
			A[i].w=read();
			nx+=A[i].x,ny=A[i].y;
		}
		nx/=1.0*n;
		ny/=1.0*n;
		nw=calc(nx,ny);
		for(int i=1;i<=4;i++)
		{
			sa();
		}
		printf("%0.3Lf %0.3Lf",ax,ay);
		return 0;
	}
}

int main()
{
	acac::main();
	return 0;
}

只有第1个点对,是参数问题还是代码错了

2025/1/22 17:04
加载中...