zoukankan      html  css  js  c++  java
  • P1824 进击的奶牛题解

    题目传递门

    本题是一道二分答案的板子题,有一点点贪心。

    总结:
    1、(l)(r)的确定,我喜欢使用数组排序来获取最终的最大值,即(r);而(l)不一定是数组的最小值,这个和题意有关,也可能是(0)

    2、即然是二分答案的模板题,那板子是必须的,另一个重要的问题就是(check)函数了,它需要检查什么呢?
    因为想向右收缩,所以应该是给定的(len)可以装下更多的奶牛。

    3、贪心是指在左手边第一个,必须安排一个奶牛,这样才能使得隔间利用最大化!其它的奶牛,看看两个隔间之间的距离差是不是大于(len),发现一个大的,就意味着能多安排一个奶牛。(now)变量每次安排完一个奶牛就更新一次,这样方便下一次迭代。

    #include <bits/stdc++.h>
    
    using namespace std;
    typedef long long LL;
    
    const int N = 1e5 + 10;
    int n, c;
    int a[N];//表示每个隔间的坐标
    
    bool check(int len) {
        //如果间距长度为 len,计算能安排下几头奶牛
        int now = a[1];
        int cnt = 1;//因为第一个位置需要先放一个
        for (int i = 2; i <= n; i++)
            if (a[i] - now >= len) {
                cnt++;
                now = a[i];
            }
        //如果能安排下的奶牛数量大于c,就是合理的,否则就是不合理的
        return cnt >= c;
    }
    
    int main() {
        //输入
        cin >> n >> c;
        for (int i = 1; i <= n; i++) cin >> a[i];
        //排序
        sort(a + 1, a + n + 1);
    
        //左右边界
        int l = a[1], r = a[n];
        while (l < r) {
            int mid = l + r + 1 >> 1;
            if (check(mid)) l = mid;//距离尽可能的大,就是向右逼近
            else r = mid - 1;
        }
        cout << l << endl;
        return 0;
    }
    
  • 相关阅读:
    SimpleDateFormat解析的时区问题
    linux之cp/scp命令+scp命令详解
    java.net.SocketException: java.security.NoSuchAlgorithmException
    Gradle使用手册(一):为什么要用Gradle?
    js_实用
    exp.validate.js
    MySQL实用技巧
    MongoDB 用户配置
    js 图片处理 Jcrop.js API
    MySQL连接池
  • 原文地址:https://www.cnblogs.com/littlehb/p/15045131.html
Copyright © 2011-2022 走看看