分析:给你半圆的圆心,半径和一些点的坐标,问你这个半圆绕圆心旋转最多能覆盖多少点。能覆盖的点,点到圆心的距离肯定是小于等于半径的,将这些点找出来,然后分别以圆心和这些点的连线为半圆的一条边,判断有多少点是在这条边的同一侧。
# include <stdio.h>
# include <math.h>
struct point
{
int x,y;
};
point v[150],p;
double Dis(point a,point b)
{
return sqrt((double)((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y)));
}
int Cross(point a,point b,point c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
int main()
{
int i,j,n,max,num;
double r;
while(scanf("%d%d%lf",&p.x,&p.y,&r),r>0)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
if(r<Dis(p,v[i]))
n--,i--;
}
for(i=0,max=0;i<n;i++)
{
for(j=0,num=0;j<n;j++)
if(Cross(p,v[i],v[j])>=0)
num++;
if(num>max)
max=num;
}
printf("%d\n",max);
}
return 0;
}