hdu 4007 Dave

经典的统计题目

题意:

给出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;
}
posted @ 2011-09-06 12:55  枕边梦  阅读(383)  评论(1编辑  收藏  举报