zoukankan      html  css  js  c++  java
  • POJ3258 River Hopscotch 二分查找+贪心

    这题给定一个系列的石头,求去除一些石头后,相邻两个石头的距离最小值最大。

    一个判定的贪心规则就是当枚举长度为D的时候,那么我们查看[0, 1]的距离是否大于D,如果小于的话,那么就直接删除掉1号点,再判定[0,2]是否满足,如果[0,2]满足了的话,那么就把2作为起点继续即可。

    代码如下:

    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <string>
    #include <map>
    #include <queue>
    #include <vector>
    #include <stack>
    #include <list>
    #include <set>
    #define MAXN 50000
    using namespace std;
    
    int L, N, M, seq[MAXN+5];
    
    inline int far(int a, int b) {
        return seq[b] - seq[a];    
    }
    
    inline bool Ac(int dis) {
        int beg = 0, cnt = M;
        for (int i = 1; i <= N+1; ++i) {
            if (far(beg, i) < dis) {
                if (!cnt) {
                    return false;
                }
                --cnt;
                continue;
            } else {
                beg = i;
            }
        }
        return true;
    }
    
    inline int bsearch(int l, int r) {
        int mid, ret;
        while (l <= r) {
            mid = (l + r) >> 1;
            if (Ac(mid)) {
                l = mid + 1;    
                ret = mid;
            } else {
                r = mid - 1;    
            }
        }
        return ret;
    }
    
    int main()
    {
        while (scanf("%d %d %d", &L, &N, &M) == 3) {
            seq[0] = 0, seq[N+1] = L;
            for (int i = 1; i <= N; ++i) {
                scanf("%d", &seq[i]);
            }
            sort(seq, seq+N+2);
            printf("%d\n", bsearch(1, L));
        }
        return 0;
    }
  • 相关阅读:
    django报错问题解决
    django2-项目实战
    django1-环境搭建与开始
    python学习-模块与包(九)
    逆水行舟,不进则退
    待学习规划内容
    越来越强大法则
    windows下安装scoop
    pytest+allure生成测试报告
    Angular vscode 调试
  • 原文地址:https://www.cnblogs.com/Lyush/p/2684011.html
Copyright © 2011-2022 走看看