贪心 Sarumans Army

题意:在一条直线上,有n个点。从这n个点中选择若干个,给他们加上标记。对于每一个点,其距离为R以内的区域里必须有一个被标记的点。问至少要有多少点被加上标记。

题解
对点的位置排一遍序,然后再找离最左边的点最远的距离为R以内的点作为边界点。

代码

#include 
#include 
#include 
#include 
using namespace std;
int N, R;
int X[1010];
void solve()
{
	sort(X, X + N);
	int i = 0, ans = 0;
	while (i < N)
	{
		int s = X[i++];
		while (i < N && X[i] <= s + R)
		{
			i++;
		}
		int p = X[i - 1];
		while (i < N && X[i] <= p + R)
		{
			i++;
		}
		ans++;
	}
	printf("%d\n", ans);
}
int main()
{
	cin >> N >> R;
	for (int i = 0; i < N; i++)
	{
		cin >> X[i];
	}
	solve();
	return 0;
}

你可能感兴趣的:(学习总结)