大意:
给出一维直线上n个点的相应坐标,和一个参数——距离R,给n个点中尽可能少的点做标记,使得n个点中,任意一个点,在R距离内都有被标记的点。
思路:
首先从最左边开始考虑,显然,从左边起,标记的第一个点,在最左边点的右侧。且选择距离R内 距离其最远的点。
接着,把上一次标记的这个点 能影响的最右边的点 的下一个点,作为最左边的点,开始又一次标记。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1001;
int n, r;
int x[maxn];
void work(){
sort(x, x + n);
int i = 0, ans = 0;
while(i < n){
int s = x[i++]; //未被覆盖的最左的点 de 坐标
while(i < n && x[i] <= s + r) //一直前进 至 距离s大于r的下一个点
i++;
int p = x[i - 1]; //新加上标记的点 de 坐标
while(i < n && x[i] <= p + r)
i++;
ans++;
}
printf("%d\n", ans);
}
int main(){
while(scanf("%d%d", &r, &n) && !(r == -1 && n == -1)){
for(int i = 0; i < n; i++)
scanf("%d", &x[i]);
work();
}
return 0;
}
刷挑战程序设计竞赛吧,不要心猿意马