HDU 4007

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

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

Run IDSubmit TimeJudge StatusPro.IDExe.TimeExe.MemoryCode Len.LanguageAuthor
46025052011-09-14 21:37:34Accepted4007109MS284K1088 BG++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;
}




评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值