题意:给定正方形的边长 r ,在平面内寻找正方形可以圈住的点的最大的个数。
分析:先对点排序,然后固定一条边,再平移另一条垂直边,得到点的个数,最后比较大小即可。
注意:不包含正方形倾斜的情况!
// Time 125ms; Memory 240k
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct point { int x,y; }; bool operator < (point a,point b) { return a.x<b.x; } int main() { int i,j,k,l,n,r,t,cnt,mx,q[1010]; point p[1010]; while(scanf("%d%d",&n,&r)!=EOF) { for(i=0;i<n;i++) scanf("%d%d",&p[i].x,&p[i].y); sort(p,p+n); mx=0;t=-1; for(i=0;i<n-mx;i++) if(p[i].x!=t) { k=0; t=p[i].x; for(j=i;j<n;j++) { if(p[j].x-p[i].x-r>0) break; q[k++]=p[j].y; } sort(q,q+k); l=0; for(j=0;j<k;j++) { while(q[j]-q[l]>r) l++; cnt=j+1-l; if(mx<cnt) mx=cnt; } } printf("%d\n",mx); } return 0; }