#include <iostream>
#include <algorithm>
using namespace std;
int N;
int R;
void Solve()
{
/*
N = 6;
R = 10;
int X[6] = {1, 7, 15, 20, 30, 50};
*/
cin >> N;
cin >> R;
int X[N];
for(int i = 0; i < N; ++i)
{
cin >> X[i];
}
int i = 0;
int result = 0;
sort(X, X + N);
while(i < N)
{
//s是没有在标记点R范围内最左边的点的位置
int s = X[i++];
while(i < N && X[i] <= s + R)
{
++i;
}
//p是新加上标记的点的位置
int p = X[i - 1];
//判断p标记的点的后面是否有需要标记的点,当i < N时,此时i指向第一个不在p的R范围内的点
//则此时i指向的点为新的起点,不用考虑i前面的点
while(i < N && X[i] <= p + R)//这个循环判断是必须的,否则会出现冗余判断点不是从p的覆盖范围外的
//第一个点开始继续判断标记
{
++i;
}
//此时i指向了p的R范围外的第一个点
//当i == N或者p右面存在不在p的R范围内的点则可以确定标记*/
++result;
}
cout << result;
}
int main()
{
Solve();
return 0;
}
POJ3069标记点
最新推荐文章于 2021-07-03 16:03:48 发布