题目链接:http://poj.org/problem?id=1106
解法:
通过枚举每一个点,然后判断这个点的左边和右边分别有多少个点,然后统计一个最大值就好了
在判断的时候用斜率来判断比较好
斜率大于k的一定在直线的左边,反之就在左边
代码:
#include<stdio.h>
#include<math.h>
#define eps 1e-8
struct point
{
double x;
double y;
};
point p[1005];
point s;
int n;
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
int get_ans()
{
int i,cnt1,cnt2,ret=0,j;
double k;
for(i=1;i<=n;i++)
{
cnt1=0,cnt2=0;
if(fabs(p[i].x-s.x)<eps)
{
for(j=1;j<=n;j++)
{
if(p[j].x>=s.x)
cnt1++;
if(p[j].x<=s.x)
cnt2++;
}
}
else
{
k=(p[i].y-s.y)/(p[i].x-s.x);
for(j=1;j<=n;j++)
{
if(p[j].y-s.y<=k*(p[j].x-s.x))
cnt1++;
if(p[j].y-s.y>=k*(p[j].x-s.x))
cnt2++;
}
}
ret=max(ret,max(cnt1,cnt2));
}
return ret;
}
int main()
{
int num,i;
point t;
double r,rr;
while(scanf("%lf%lf%lf",&s.x,&s.y,&r)!=EOF)
{
if(r<0.0)
break;
scanf("%d",&num);
n=0;
for(i=1;i<=num;i++)
{
scanf("%lf%lf",&t.x,&t.y);
rr=(t.x-s.x)*(t.x-s.x)+(t.y-s.y)*(t.y-s.y);
if(rr<=r*r)
{
n++;
p[n].x=t.x;
p[n].y=t.y;
}
}
if(n==0)
{
printf("0\n");
continue;
}
int ans=get_ans();
printf("%d\n",ans);
}
return 0;
}