给出n的点,和一个边长L,求在一个边长为L的正方形内最多能出现多少个点。
枚举所有点,在xi-xi+L
通过尺取法求出最大值。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,L;
struct node{
int x,y;
friend bool operator <(const node &a,const node &b){
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
}p[1100];
int t[1100];
void solve(){
int maxn = 0;
sort(p,p+n);
// for(int i=0;i<n;++i)
// cout<<p[i].x<<' '<<p[i].y<<endl;
int cnt;
for(int i=0;i<n;++i){
cnt = 0; //统计点数
for(int j=i;j<n;++j){
if(p[j].x-p[i].x <= L){
t[cnt++] = p[j].y;
}
if(p[j].x - p[i].x > L) break; //剪枝
}
if(cnt){ //p[i].x -> p[i].x 区间内存在点
sort(t,t+cnt);
int l = 0,r = 0;
while(l<cnt){ //尺取法
while(t[r] <= t[l] + L && r<cnt){
maxn = max(maxn,r-l+1);
r++;
}
l++;
}
}
}
cout<<maxn<<endl;
}
int main(){
while(cin>>n>>L){
for(int i=0;i<n;++i){
cin>>p[i].x>>p[i].y;
}
solve();
}
return 0;
}