题意:给你n个点(n<=1000),然后给你一个正方形,问这个正方形最多能覆盖多少个点。
一般思路都是将正方形先x方向移然后再向y移求最大,显然是需要排序的,方便统计。那么会不会tle呢?两个for,n*n 可以满足。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=1010;
struct point
{
int x,y;
}p[maxn];
bool cmp(point p1,point p2)
{
return p1.x<p2.x;
}
int n,r,ans,k;
int t[maxn];
int init()
{
int i,j;
int cnt,tmp=0;
for(i=0;i<k;i++)
{
cnt=0;
j=i;
while(t[j]-t[i]<=r)
{
j++;
cnt++;
if(j>=k) break;
}
if(cnt>tmp) tmp=cnt;
}
return tmp;
}
int main()
{
int tt=0;
while(scanf("%d %d",&n,&r)!=EOF)
{
ans=0;
int i,j,xmin,xmax,tm;
for(i=0;i<n;i++)
scanf("%d%d",&p[i].x,&p[i].y);
sort(p,p+n,cmp);
for(i=0;i<n;i++)
{
xmin=p[i].x;
xmax=xmin+r;
k=0;
for(j=i;p[j].x<=xmax&&j<n;j++)
{
t[k++]=p[j].y;
}
sort(t,t+k);
tm=init();
if(ans<tm) ans=tm;
}
printf("%d\n",ans);
}
return 0;
}