经典的统计题目
题意:
给出N个人的坐标,求出在以r为边的正方形中最多的人数
分析:
因为正方形的位置并未固定,而要满足覆盖最多的点,则以某一个点的y坐标作为下边界一定有最优解,所有:
首先对N个人的纵坐标进行排序,枚举所有Y坐标(正方形下边界),找出满足以当前y坐标为下边界的正方形内的点,再枚举满足条件的点X坐标,计算以r为边最多可覆盖的点,总复杂度O(n^2)
代码:
#include<iostream> #include<algorithm> using namespace std; struct node { int x,y; }p[1001]; int n,ans,r,xx[1001],yy[1001]; int main() { while(scanf("%d %d",&n,&r)==2) { for(int i=1;i<=n;i++) { scanf("%d %d",&p[i].x,&p[i].y); yy[i]=p[i].y; } sort(yy+1,yy+1+n); ans=0; for(int j=1;j<=n;j++)//枚举下边界 { int cnt=0; for(int i=1;i<=n;i++) if(p[i].y>=yy[j]&&p[i].y<=yy[j]+r) xx[cnt++]=p[i].x;//找出所有满足当前下边界的点 sort(xx,xx+cnt); xx[cnt]=INT_MAX;//用来退出while循环 int e=0; for(int i=0;i<cnt;i++)//求出以当前点位左边界的,边长为r的边,最多可覆盖的点 { while(xx[e]<=xx[i]+r) e++; ans=max(ans,e-i); } } printf("%d\n",ans); } return 0; }