题意给出一些点片段圆心为t半径为r的半圆最大能覆盖多少个点。
首先在输入的时候把距离大于半径的点筛出去。剩余点通过极角排序然后枚举半圆的一条边通过该点能覆盖的点数取最大值就可以了。
#include <iostream> #include<cstdio> #include<algorithm> using namespace std; struct point { int x,y; }; int Direction(point a,point b,point c) { return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x); } int adistan(point a,point b) { return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); } point t,data[2000]; bool cmp(point a,point b) { if(Direction(t,a,b)>=0) return 1; return 0; } int main() { double r; int n; while(~scanf("%d%d%lf",&t.x,&t.y,&r),r>=0) { scanf("%d",&n); int w=0,maxnum=0; while(n--) { point temp; scanf("%d%d",&temp.x,&temp.y); if((double)adistan(temp,t)<=r*r) data[w++]=temp; } sort(data,data+w,cmp); for(int i=w; i<w+w; i++) data[i]=data[i-w]; for(int i=0; i<w; i++) { int num=1; for(int j=i+1; j<w+i; j++) { if(Direction(t,data[i],data[j])<0) break; num++; } maxnum=max(maxnum,num); } printf("%d\n",maxnum); } return 0; }