HDU 4007

题意:给你n个点(n<=1000),然后给你一个正方形,问这个正方形最多能覆盖多少个点。

一般思路都是将正方形先x方向移然后再向y移求最大,显然是需要排序的,方便统计。那么会不会tle呢?两个for,n*n 可以满足。没什么陷阱,果断1y。。。最近状态不错。。。

Run ID Submit Time Judge Status Pro.ID Exe.Time Exe.Memory Code Len. Language Author
4602505 2011-09-14 21:37:34 Accepted 4007 109MS 284K 1088 B G++ xym2010
#include<cstdio>
#include<cstring>
#include<string>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
const int INF=1000100000;
struct node
{
	int x,y;
}n[1010];
bool cmp(node a,node b)
{
	return a.x<b.x;
}
int main()
{
	int p,r,xmax,xmin,ymax,ymin,y[1010];
	while(scanf("%d%d",&p,&r)!=EOF)
	{
		ymax=xmax=-INF;ymin=xmin=INF;
		for(int i=0;i<p;i++)
		{
			scanf("%d%d",&n[i].x,&n[i].y);
			if(ymax<n[i].y)ymax=n[i].y;
			if(ymin>n[i].y)ymin=n[i].y;
			if(xmax<n[i].x)xmax=n[i].x;
			if(xmin>n[i].x)xmin=n[i].x;
		}
		if((ymax-ymin<=r)&&(xmax-xmin<=r))
		{
			printf("%d\n",p);
			continue;
		}
		else
		{
			sort(n,n+p,cmp);
			int ans=0;
			for(int i=0;i<p;i++)
			{
				int k=0;
				for(int j=i;n[j].x<=n[i].x+r&&j<p;j++)
				{
					y[k++]=n[j].y;
				}
				sort(y,y+k);
				int count=0,tem=0;
				for(int j=0;j<k&&tem<k;j++)
				{
					while(y[tem]-y[j]<=r&&tem<k)tem++;
					if(count<tem-j)count=tem-j;
				}
				if(ans<count)ans=count;
			}
			printf("%d\n",ans);
		}
	}
	return 0;
}




你可能感兴趣的:(struct,2010)