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; }