调了0.5h还是20pts
#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;
}