Time Limit: 3000MS | Memory Limit: 65536K | |
Total Submissions: 6482 | Accepted: 1993 |
Description
Input
Output
Sample Input
3 1000 50 1 10 10 100 100 4 10 10 10 90 90 10 90 90 3000 3000 4 1200 85 63 2500 2700 2650 2990 100
Sample Output
The safest point is (1000.0, 50.0). The safest point is (50.0, 50.0). The safest point is (1433.0, 1669.8).
思路:直接按照题解做的,首先列举30个随机点,然后分别进行短距离的随机尝试
#include <cstdio> #include <ctime> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> using namespace std; const double Pi=acos(-1.0); const double eps=1e-3; const double inf=1e20; double px[31],py[31],d[31],x[1111],y[1111]; double caldis(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main(){ int T; scanf("%d",&T); srand(9876543); while(T--){ int a,b,m; scanf("%d%d%d",&a,&b,&m); for(int i=0;i<m;i++){ scanf("%lf%lf",x+i,y+i); } for(int i=0;i<30;i++){ px[i]=(double)(rand()%1000+1)/1000.000*a; py[i]=(double)(rand()%1000+1)/1000.000*b; d[i]=inf; for(int j=0;j<m;j++)d[i]=min(d[i],caldis(px[i],py[i],x[j],y[j])); } double delta=double(max(a,b))/(sqrt(1.0*m)); while(delta>eps){ for(int i=0;i<30;i++){ double tx=px[i],ty=py[i]; for(int j=0;j<30;j++){ double theta=(double)(rand()%1000+1)/1000.000*10*Pi; double dx=delta*cos(theta); double dy=delta*sin(theta); tx+=dx;ty+=dy; if(tx<0||tx>a||ty<0||ty>b){tx-=dx;ty-=dy;continue;} double td=inf; for(int k=0;k<m;k++)td=min(td,caldis(tx,ty,x[k],y[k])); if(td>d[i]){ d[i]=td;px[i]=tx;py[i]=ty; } tx-=dx;ty-=dy; } } delta*=0.9; } double ans=0;int ind=0; for(int i=0;i<30;i++){ if(d[i]>ans){ ind=i; ans=d[i]; } } printf("The safest point is (%.1f, %.1f).\n",px[ind],py[ind]); } return 0; }