直线上有一些点,每个点距离为R的范围内必须有带有标记的点。需要标记最少的点来实现。
解法:贪心
显然,我们应该从最左边的点开始标记,然后选择一个在本次标记点覆盖范围外的第一个点。
#include<cstdio>
#include<algorithm>
using namespace std;
int n, r, ans;
int a[1200];
int main(){
for (int p = 1; ; p++){
ans = 0;
scanf("%d%d", &r, &n);
if(r == -1) break;
for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
sort(a + 1, a + n + 1);
int now = 1, l = 0;
while(l <= n){
while (a[l] - a[now] <= r) l++;
l--;
now = l;
ans++;
while(a[now] - a[l] <= r) now++;
l = now;
}
for (int i = 1; i <= n; i++) a[i] = 0;
printf("%d\n", ans);
}
return 0;
}