地址:http://poj.org/problem?id=1106
题目:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 5405 | Accepted: 2873 |
Description
Input
Output
Sample Input
25 25 3.5 7 25 28 23 27 27 27 24 23 26 23 24 29 26 29 350 200 2.0 5 350 202 350 199 350 198 348 200 352 200 995 995 10.0 4 1000 1000 999 998 990 992 1000 999 100 100 -2.5
Sample Output
3 4 4
Source
思路:
直接枚举
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <algorithm> 5 6 7 using namespace std; 8 const double PI = acos(-1.0); 9 const double eps = 1e-10; 10 11 /****************常用函数***************/ 12 //判断ta与tb的大小关系 13 int sgn( double ta, double tb) 14 { 15 if(fabs(ta-tb)<eps)return 0; 16 if(ta<tb) return -1; 17 return 1; 18 } 19 20 //点 21 class Point 22 { 23 public: 24 25 double x, y; 26 27 Point(){} 28 Point( double tx, double ty){ x = tx, y = ty;} 29 30 bool operator < (const Point &_se) const 31 { 32 return x<_se.x || (x==_se.x && y<_se.y); 33 } 34 friend Point operator + (const Point &_st,const Point &_se) 35 { 36 return Point(_st.x + _se.x, _st.y + _se.y); 37 } 38 friend Point operator - (const Point &_st,const Point &_se) 39 { 40 return Point(_st.x - _se.x, _st.y - _se.y); 41 } 42 //点位置相同(double类型) 43 bool operator == (const Point &_off)const 44 { 45 return sgn(x, _off.x) == 0 && sgn(y, _off.y) == 0; 46 } 47 48 }; 49 50 /****************常用函数***************/ 51 //点乘 52 double dot(const Point &po,const Point &ps,const Point &pe) 53 { 54 return (ps.x - po.x) * (pe.x - po.x) + (ps.y - po.y) * (pe.y - po.y); 55 } 56 //叉乘 57 double xmult(const Point &po,const Point &ps,const Point &pe) 58 { 59 return (ps.x - po.x) * (pe.y - po.y) - (pe.x - po.x) * (ps.y - po.y); 60 } 61 //两点间距离的平方 62 double getdis2(const Point &st,const Point &se) 63 { 64 return (st.x - se.x) * (st.x - se.x) + (st.y - se.y) * (st.y - se.y); 65 } 66 //两点间距离 67 double getdis(const Point &st,const Point &se) 68 { 69 return sqrt((st.x - se.x) * (st.x - se.x) + (st.y - se.y) * (st.y - se.y)); 70 } 71 72 Point pt[200],cr; 73 double r; 74 int main(void) 75 { 76 while(~scanf("%lf%lf%lf",&cr.x,&cr.y,&r)) 77 { 78 if(sgn(r,0)<0) break; 79 int n,ans=0; 80 scanf("%d",&n); 81 r*=r; 82 for(int i=1;i<=n;i++) 83 scanf("%lf%lf",&pt[i].x,&pt[i].y); 84 for(int i=1;i<=n;i++) 85 if(sgn(getdis2(cr,pt[i]),r)<=0) 86 { 87 int cnt=1; 88 for(int j=1;j<=n;j++) 89 if(i!=j && sgn(getdis2(cr,pt[j]),r)<=0 && sgn(xmult(cr,pt[i],pt[j]),0)>=0) 90 cnt++; 91 ans=max(ans,cnt); 92 } 93 printf("%d\n",ans); 94 } 95 return 0; 96 }
原文:http://www.cnblogs.com/weeping/p/7653168.html