zoukankan      html  css  js  c++  java
  • 洛谷P2440 木材加工 题解 二分答案

    题目链接:https://www.luogu.com.cn/problem/P2440

    首先,我们可以编写一个 bool check(int len) 函数,该函数用于验证小段长度为 len 时,得到的小段的数量是否达到了 K 根。
    可以发现:随着 len 的增加,可以砍伐的小段的数量肯定是单调非递增的(即要么不变,要么减少)。
    也就是说:
    存在一个 X,使得当 len ≤ X 时,check(len) 均返回 true;当 len ≥ X+1 时,check(len) 均返回 false。

    于是我们可以将 len 作为自变量,将 check(len) 最为应变量来进行二分,找到这个最大的 X。

    实现代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    int n, k, a[100010];
    bool check(int len)
    {
        int cnt = 0;
        for (int i = 0; i < n; i ++)
        {
            cnt += a[i] / len;
            if (cnt >= k)
                return true;
        }
        return false;
    }
    int main()
    {
        cin >> n >> k;
        for (int i = 0; i < n; i ++)
            cin >> a[i];
        int L = 1, R = 100000000, res = 0;
        while (L <= R)
        {
            int mid = (L + R) / 2;
            if (check(mid))
            {
                res = mid;
                L = mid+1;
            }
            else
                R = mid-1;
        }
        cout << res << endl;
        return 0;
    }
    
  • 相关阅读:
    centos-docker安装及基本使用
    List集合-03.Vector
    List集合-02.LinkedList
    List集合-01.ArrayList
    常用图像处理方法
    git使用
    bug记录
    bash vim等常用命令
    python常用
    MTCNN试用
  • 原文地址:https://www.cnblogs.com/quanjun/p/12562228.html
Copyright © 2011-2022 走看看