zoukankan      html  css  js  c++  java
  • 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
    ", ans);
    }
    
    int main() {
        scanf("%d%d", &N, &R);
        for(int i = 0; i < N; i ++)
            scanf("%d", &X[i]);
        solve();
        return 0;
    }
    

      

  • 相关阅读:
    工作总结06
    工作总结05
    工作总结04
    站立会议01
    团队项目估算
    团队项目计划会议
    团队需求分析视频
    团队介绍
    团队项目计划会议01
    电梯演讲
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/9553590.html
Copyright © 2011-2022 走看看