zoukankan      html  css  js  c++  java
  • P1316 丢瓶盖(二分+贪心)

    思路:都在注解里

    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int maxn = 1e5 + 10;
    int a[maxn], n, m, ans, mid;
    
    bool check(int x){
        int sum = 1, p = 1;
        for (int i = 2; i <= n;++i)
        if (a[i] - a[p] >= x){ sum++; p = i; }
        return sum>=m;    
        //存在大于等于最短距离x有sum,并且sum>=x,当然在实际中有可能不能分到x段,但是一定存在比x小的段落。
        //那怎么保证最后的答案一定存在?
        //我们已知一定存在最短距离的最大值,也就是说当大于这个值时,一定使检验函数不成立,所以,在实际划分时一定能分到。但是,注意在其他值时不一定可以分到,包括在最小值时,也能分到。
    }
    
    void half(){
        int l = 0, r = a[n];
        while (l <= r){
            mid = (l + r) >> 1;
            if (check(mid)){  l = mid + 1; }
            else r = mid - 1;
        }
        ans = r;
    }
    
    int main(){
        cin >> n >> m;
        for (int i = 1; i <= n; ++i)
            cin >> a[i];
        sort(a + 1, a + 1 + n);
        half();
        cout << ans << endl;
    }
  • 相关阅读:
    java的堆和栈
    概率题
    并发复习在回顾
    hashmap和hashtable
    StringBuilder和StringBuffer
    WinSCP 工具
    网络桥接注意问题。
    虚拟机网络设置
    Spring任务计划
    Spring任务执行器(TaskExecutor)
  • 原文地址:https://www.cnblogs.com/ALINGMAOMAO/p/10459323.html
Copyright © 2011-2022 走看看