http://acm.hdu.edu.cn/showproblem.php?pid=4007
题意:给出一系列整数点(X,Y),求用一个边长为R的正方形(平行于坐标轴)最多能够圈住多少个点(包括正方形的边界)。
先对X坐标排序,找出X轴符合的点,再对Y坐标排序寻找符合的点。
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
struct dian{
int x,y;
}a[1005],temp[1005];
void init(int num[])
{
int i;
for(i=0;i<1005;i++)
num[i]=1;
}
bool cmpx(dian a,dian b)
{
return a.x<b.x;
}
bool cmpy(dian a,dian b)
{
return a.y>b.y;
}
int main()
{
int n,r;
while(scanf("%d%d",&n,&r)!=EOF)
{
int i,j,k;
int num[1005];
for(i=0;i<n;i++)
scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmpx);
init(num);
int numm;
int max=1;
for(i=0;i<n;i++)
{
int l=0;
for(j=i;a[j].x-a[i].x<=r&&j<n;j++)
{
temp[l++].y=a[j].y;
}
sort(temp,temp+l,cmpy);
for(j=0;j<l;j++)
{
numm=1;
for(k=j+1;k<l&&temp[j].y-temp[k].y<=r;k++)
{
numm++;
}
if(numm>max)
max=numm;
}
}
printf("%d\n",max);
}
return 0;
}