分析
如果超出半径的点直接不要了。
然后枚举以某个点为平角的时候,求两侧的覆盖数,取max。(半圆)
判断两侧就用叉积
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int xx,yy,n,x[1010],y[1010],v[1010],mx;
double r;
bool dis(int a,int b)
{
if(r*r<(a-xx)*(a-xx)+(b-yy)*(b-yy)) return false;
else return true;
}
int cj(int i,int j)
{
return (x[i]-xx)*(y[j]-yy)-(x[j]-xx)*(y[i]-yy);
}
int main()
{
while(scanf("%d%d%lf",&xx,&yy,&r)!=EOF)
{
if(r<0) return 0;
memset(v,0,sizeof(v));
cin>>n;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x[i],&y[i]);
if(dis(x[i],y[i])==true) v[i]=1;
}
for(int i=1;i<=n;i++)
{
if(!v[i]) continue;
int left=0,right=0;
for(int j=1;j<=n;j++)
{
if(!v[j]) continue;
if(cj(i,j)>=0) left++;
if(cj(i,j)<=0) right++;
}
mx=max(mx,max(left,right));
}
cout<<mx<<endl;
mx=0;
}
return 0;
}
/*
25 25 3.5
7
25 28
23 27
27 27
24 23
26 23
24 29
26 29
*/