90Wa#8,求调
查看原帖
90Wa#8,求调
770611
xxxxxzy楼主2023/8/7 19:41

交了很多次没调出来,有个点一Wa到底,不开O2只能T60

写的退火

求调

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define delta 0.971
int n,f;
long double dx[100005],dy[100005],ansx,ansy,ans=1e8,tmp;
long double d(double x,double y,double x2,double y2){
	return (x-x2)*(x-x2)+(y-y2)*(y-y2);
}
void clac(double x,double y){
	tmp=-1;
	for(int i=0;i<n;i++){
		long double j=d(x,y,dx[i],dy[i]);
		j=sqrt(j);
		if(j>tmp) tmp=j,f=i;
	}
}
void begin(){
	long double t=30000;
	while(t>1e-18){
		clac(ansx,ansy);
		ans=min(ans,tmp);
//		cout<<tmp<<" "<<ans<<" "<<f<<endl;
		ansx+=(dx[f]-ansx)*t/tmp;
		ansy+=(dy[f]-ansy)*t/tmp;
		t*=delta;
	}
}
signed main(){
    srand(1e9+7);
	cin>>n;
	double sum1=0,sum2=0;
	for(int i=0;i<n;i++) scanf("%Lf%Lf",&dx[i],&dy[i]),sum1+=dx[i],sum2+=dy[i];
	ansx=sum1/n,ansy=sum2/n;
	clac(ansx,ansy);
	ans=tmp;
	while((double)clock()/CLOCKS_PER_SEC<0.5) begin();
//	cout<<ans<<endl;
	printf("%.11Lf\n%.11Lf %.11Lf",ans,ansx,ansy);
} 
2023/8/7 19:41
加载中...