萌新刚学OI,SA调参自闭求救
  • 板块灌水区
  • 楼主引领天下魔酸
  • 当前回复11
  • 已保存回复11
  • 发布时间2020/8/5 19:27
  • 上次更新2023/11/6 21:13:09
查看原帖
萌新刚学OI,SA调参自闭求救
39863
引领天下魔酸楼主2020/8/5 19:27

调了0.5h还是20pts

image.png

#include<bits/stdc++.h>
using namespace std;
int n,m,k,x[1005],y[1005],i,c,nc;
double p,q,ans=1<<30,delta=0.998,tx,ty,X,Y,t,now,Delta;
inline void distance(){
	now=1e12;
	for(i=1;i<=k;i++)now=min(now,sqrt((X-x[i])*(X-x[i])+(Y-y[i])*(Y-y[i])));
	Delta=now-ans;
	return ;
}
inline void SA(){
	t=sqrt(n*n+m*m)*0.5;
	while(t>1e-6){
		X=tx+(rand()/RAND_MAX)*t;
		Y=ty+(rand()/RAND_MAX)*t;
		if(X<0||X>n||Y<0||Y>m)continue;
		distance();
		if(Delta>=0)ans=now,p=tx=X,q=ty=Y;
		else if(exp(-Delta/t)*RAND_MAX>rand())tx=X,ty=Y;
		t*=delta;
		c++;if(nc&&c-nc>5000)break;
	}
}
int main(){
	srand(19260817);
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=k;i++)scanf("%d%d",&x[i],&y[i]);tx=p=n>>1,ty=q=m>>1;
	SA();
	tx=n/k,ty=m/k;
	SA();
	nc=c;tx=n*rand()/RAND_MAX,ty=m*rand()/RAND_MAX;
	SA();
	printf("The safest point is (%.1f, %.1f).",p,q);
	return 0;
}
2020/8/5 19:27
加载中...