题意:直线上有n个点,点i的位置是Xi。从这n个点中选择若干个,给它们加上标记。对每一个点,其距离为R以内的区域里必须有带标记的点(本身为带有标记的点,可以认为与其距离为0的地方有一个带有标记的点)。在满足这个条件的情况下,希望能为尽可能少的点添加标记。求最少要有多少个点被加上标记。
算法:贪心。首先把输入的Xi进行升序排序,从最左侧的点0开始,向右找出最远的一个点j,使得点j加标记后能覆盖点0而点(j+1)加标记后不能覆盖点0,那么点j为第一个要加标记的点,然后向右找出点j不能覆盖的第一个点m,从点m开始,重复上述步骤即可。
算法:贪心。首先把输入的Xi进行升序排序,从最左侧的点0开始,向右找出最远的一个点j,使得点j加标记后能覆盖点0而点(j+1)加标记后不能覆盖点0,那么点j为第一个要加标记的点,然后向右找出点j不能覆盖的第一个点m,从点m开始,重复上述步骤即可。
#include <iostream>
#include <algorithm>
using namespace std;
int R,n;
int a[1010];
void solve()
{
int i=0;
int ans = 0;
while (i < n)
{
int start1 = a[i++];
while(i < n && start1 + R >= a[i])
{
i++;
}
int start2 = a[i-1];
while (i < n && start2 + R >= a[i])
{
i++;
}
ans++;
}
cout << ans << endl;
}
int main()
{
while (cin >> R >> n)
{
if (R == -1 && n == -1)
{
break;
}
for (int i=0; i<n; i++)
{
cin >> a[i];
}
sort(a,a+n);
solve();
}
}