POJ 3069 Saruman's Army
贪心练习
题目大意:
直线上有 $N$ 个点, 点 $i$ 的位置是 $Xi$ 。从这些点中选取若干个,给他们加上标记,对每一个点,其距离为 $R$ 以内的区域里必须有一个带标记的点,在这个条件下希望尽可能少的添加标记,球被加上标记的点的个数
题解:
从最左开始考虑,距离为 $R$ 以内最远的点,因为更左的区域没有覆盖的意义,所以尽可能靠右,循环此过程
样例:
$N = 6 R = 10$
$X = ${1, 7, 15, 20, 30, 50}
标记点数为:3
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
int N, R;
int X[maxn];
void solve() {
sort(X, X + N);
int i = 0, ans = 0;
while(i < N) {
int s = X[i ++];
while(i < N && X[i] <= R + s) i ++;
int p = X[i - 1];
while(i < N && X[i] <= R + p) i ++;
ans ++;
}
printf("%d\n", ans);
}
int main() {
scanf("%d%d", &N, &R);
for(int i = 0; i < N; i ++)
scanf("%d", &X[i]);
solve();
return 0;
}

浙公网安备 33010602011771号