经典的统计题目
题意:
给出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;
}