POJ - 3069 Saruman‘s Army

题目大意
给定一组点, 一个距离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;
 } 

猜你喜欢

转载自blog.csdn.net/qq_45432665/article/details/108651139