分析:
把在半径内的点处理出来 计算叉积 m m m 判断在左边 l l l 或右边 r r r 并计数 a n s ans ans即 m a x ( l , r ) max(l,r) max(l,r)
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define reg register
using namespace std;
typedef long long ll;
const int N=1e4+5;
int lx,ly,ans,n;
struct node{
int x,y;
}a[N];
double r;
int main()
{
while(scanf("%d%d%lf",&lx,&ly,&r)!=EOF)
{
if(r<0) break;
scanf("%d",&n);
int tot=0; ans=0;
memset(a,0,sizeof a);
while(n--)
{
int x,y;
scanf("%d%d",&x,&y);
double dis=sqrt((x-lx)*(x-lx)+(y-ly)*(y-ly));
if(dis>r) continue;
a[++tot]=(node){x,y};
}
for(int i=1;i<=tot;i++)
{
int L=0,R=0;
for(int j=1;j<=tot;j++)
{
int m=(a[i].x-lx)*(a[j].y-ly)-(a[i].y-ly)*(a[j].x-lx);
if(m==0) L++,R++;
else (m>0)?R++:L++;
}
ans=max(ans,max(L,R));
}
printf("%d\n",ans);
}
return 0;
}