标签:scan tween points 多少 4.0 case 大于 auth 最大值
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1077
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 2636 Accepted Submission(s): 969
#include<bits/stdc++.h> using namespace std; typedef long long LL; #define max_v 305 double p[max_v][2]; int n; double dis(double x1,double y1,double x2,double y2)//两点距离 { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double f(int i,int j) { double x1,y1,x2,y2,x3,y3,x4,y4,x5,y5; x1=p[i][0]; y1=p[i][1]; x2=p[j][0]; y2=p[j][1]; double s=dis(x1,y1,x2,y2); double xx=(y2-y1)/s;//(xx,yy)相当于与弦长垂直的单位法向量 double yy=(x1-x2)/s; s=s/2.0; s=sqrt(1.0-s*s);//圆心与两点弦长的距离 x3=(x1+x2)/2.0; y3=(y1+y2)/2.0;//(x3,y3)是(x1,y1),(x2,y2)的中点 int c1=0,c2=0; x4=x3+s*xx; y4=y3+s*yy;//(x4,y4)现在是圆心 for(int i=0;i<n;i++) { if(dis(x4,y4,p[i][0],p[i][1])<1.0001) c1++; } x5=x3-s*xx; y5=y3-s*yy;//(x5,y5)现在是圆心 for(int i=0;i<n;i++) { if(dis(x5,y5,p[i][0],p[i][1])<1.0001) c2++; } if(c1>c2) return c1; else return c2; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%lf %lf",&p[i][0],&p[i][1]); } int temp,sum=1; //暴力,每次让两点恰好位于单位圆上,算出圆心。然后找覆盖点的数目,输出最大的 for(int i=0;i<n;i++) { for(int j=i+1;j<n;j++) { if(dis(p[i][0],p[i][1],p[j][0],p[j][1])<2.0001)//距离大于2.0001的点可以不枚举,因为这两点肯定不在一个单位圆上 { temp=f(i,j); if(sum<temp) { sum=temp; } } } } printf("%d\n",sum); } return 0; }
HDU 1077 Catching Fish(用单位圆尽可能围住多的点)
标签:scan tween points 多少 4.0 case 大于 auth 最大值
原文地址:https://www.cnblogs.com/yinbiao/p/9327392.html