题意:
给你n个点,找存在于R里面的最多点数,包括边缘的点。
解:
暴力枚举。将点按x排序。对于每个x,将在x+R范围内的点记录下来。从上到下枚举以谁作为上边界。每次找最大即可。
做题过程:
哎,又是写错了一个地方肿么都看不出来。而且不是逻辑性错误,只是笔误而已。。。。
/*
Pro: 0
Sol:
date:
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <set>
#include <vector>
#define inf 1000000111
using namespace std;
int n,R,y[1111],ans;
struct point{
int x,y;
bool operator < (const point & cmp) const{
return x < cmp.x;
}
}p[1111];
int main(){
while(scanf("%d%d",&n,&R) != EOF){
ans = 0;
int min_x = inf, min_y = inf, max_x = -inf, max_y = -inf;
for(int i = 0; i < n; i ++){
scanf("%d%d",&p[i].x, &p[i].y);
min_x = min(min_x,p[i].x);
max_x = max(max_x,p[i].x);
min_y = min(min_y,p[i].y);
max_y = max(max_y,p[i].y);
}
if(max_x - min_x <= R && max_y - min_y <= R){
// cout << min_x << max_x << min_y << max_y << endl;
printf("%d\n",n); continue;
}
sort(p,p + n);
for(int i = 0; i < n; i ++){//以i的x为左边界
int j = i, sub = 0;//不能等于i + 1,这样忽略了本身
while(p[j].x <= p[i].x + R && j < n) {
y[sub ++] = p[j].y;
j ++;
}
sort(y,y + sub); j = 0;
// cout << sub << " kakka " << endl;
for(int k = 0; k < sub && j < sub; k ++){//这里还要加上个j < sub
while(y[j] <= y[k] + R && j < sub) {
// printf("I will %d\n",p[j].y); 哎,这里写成了p[j].y <= p[k].y + R 了,受上面的影响
j ++;//这里是小于sub。。。
}
ans = max(ans,j - k);
// printf("%d %d\n",i,ans);
}
}
printf("%d\n",ans);
}
return 0;
}