poj 1981 Circle and Points
题目链接:http://poj.org/problem?id=1981
解题思路:枚举两个点,求过这两点的单位圆,判断有多少个点在圆中。
1 /////////////////////////////////////////////////////////////////////////// 2 //problem_id: poj 1981 3 //user_id: SCNU20102200088 4 /////////////////////////////////////////////////////////////////////////// 5 6 #include <algorithm> 7 #include <iostream> 8 #include <iterator> 9 #include <iomanip> 10 #include <cstring> 11 #include <cstdlib> 12 #include <string> 13 #include <vector> 14 #include <cstdio> 15 #include <cctype> 16 #include <cmath> 17 #include <queue> 18 #include <stack> 19 #include <list> 20 #include <set> 21 #include <map> 22 using namespace std; 23 24 /////////////////////////////////////////////////////////////////////////// 25 typedef long long LL; 26 const double EPS=1e-8; 27 const double PI=acos(-1.0); 28 29 const int x4[]={-1,0,1,0}; 30 const int y4[]={0,1,0,-1}; 31 const int x8[]={-1,-1,0,1,1,1,0,-1}; 32 const int y8[]={0,1,1,1,0,-1,-1,-1}; 33 34 typedef int T; 35 T max(T a,T b){ return a>b? a:b; } 36 T min(T a,T b){ return a<b? a:b; } 37 /////////////////////////////////////////////////////////////////////////// 38 39 /////////////////////////////////////////////////////////////////////////// 40 //Add Code: 41 struct Point{ 42 double x,y; 43 Point(double dx=0,double dy=0):x(dx),y(dy){} 44 }p[305]; 45 46 double dist(Point a,Point b){ 47 return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 48 } 49 50 Point circle(Point a,Point b){ 51 Point mid((a.x+b.x)/2,(a.y+b.y)/2); 52 double angle=atan2(a.x-b.x,b.y-a.y); 53 double d=sqrt(1-dist(a,mid)*dist(a,mid)); 54 Point ret(mid.x+d*cos(angle),mid.y+d*sin(angle)); 55 return ret; 56 } 57 /////////////////////////////////////////////////////////////////////////// 58 59 int main(){ 60 /////////////////////////////////////////////////////////////////////// 61 //Add Code: 62 int n,i,j,k; 63 while(scanf("%d",&n)!=EOF){ 64 if(n==0) break; 65 for(i=0;i<n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); 66 int Max=1; 67 for(i=0;i<n;i++){ 68 for(j=i+1;j<n;j++){ 69 if(dist(p[i],p[j])>2.0) continue; 70 Point center=circle(p[i],p[j]); 71 int num=0; 72 for(k=0;k<n;k++){ 73 if(dist(center,p[k])<1.0+EPS) num++; 74 } 75 Max=max(Max,num); 76 } 77 } 78 printf("%d\n",Max); 79 } 80 /////////////////////////////////////////////////////////////////////// 81 return 0; 82 } 83 84 /////////////////////////////////////////////////////////////////////////// 85 /* 86 Testcase: 87 Input: 88 3 89 6.47634 7.69628 90 5.16828 4.79915 91 6.69533 6.20378 92 6 93 7.15296 4.08328 94 6.50827 2.69466 95 5.91219 3.86661 96 5.29853 4.16097 97 6.10838 3.46039 98 6.34060 2.41599 99 8 100 7.90650 4.01746 101 4.10998 4.18354 102 4.67289 4.01887 103 6.33885 4.28388 104 4.98106 3.82728 105 5.12379 5.16473 106 7.84664 4.67693 107 4.02776 3.87990 108 20 109 6.65128 5.47490 110 6.42743 6.26189 111 6.35864 4.61611 112 6.59020 4.54228 113 4.43967 5.70059 114 4.38226 5.70536 115 5.50755 6.18163 116 7.41971 6.13668 117 6.71936 3.04496 118 5.61832 4.23857 119 5.99424 4.29328 120 5.60961 4.32998 121 6.82242 5.79683 122 5.44693 3.82724 123 6.70906 3.65736 124 7.89087 5.68000 125 6.23300 4.59530 126 5.92401 4.92329 127 6.24168 3.81389 128 6.22671 3.62210 129 0 130 Output: 131 2 132 5 133 5 134 11 135 */ 136 ///////////////////////////////////////////////////////////////////////////
posted on 2013-08-28 23:33 SCNU20102200088 阅读(357) 评论(0) 编辑 收藏 举报