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

  

posted @ 2018-08-29 12:36  丧心病狂工科女  阅读(180)  评论(0编辑  收藏  举报