题目大意
给定一组点, 一个距离r, 标记某个点那么拿的前面距离r和后面距离r内的点都会被覆盖, 求全部覆盖需要标记多少个点
样例
Sample Input
0 3
10 20 20
10 7
70 30 1 7 15 20 50
-1 -1
Sample Output
2
4
思路
从第一个点开始找到他的刚好离他距离大于r的点的上一个点就是距离他最远的满足要求的点,那么这就是标记的点, 往后面找到他可以覆盖的最远的点,这就是一组答案,下一次就是从他不覆盖的那个点开始,重复上面的操作,每次ans都自加一, 最后就可以得到最终的答案。
代码
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N];
int main()
{
int n, r;
while(cin >> r >> n)
{
if(r == -1) break;
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
int ans = 0;
int i = 0;
while(i < n)
{
int p = a[i++];
while(a[i] - p <= r && i < n) i++;
int x = a[i - 1];
while(i < n && a[i] <= x + r) i++;
ans++;
}
cout <<ans << endl;
}
return 0;
}