• 洛谷P2440 木材加工 —二分答案


    题目背景

    要保护环境

    题目描述

    木材厂有 nn 根原木,现在想把这些木头切割成 kk 段长度为 ll 的小段木头(木头有可能有剩余)。

    当然,我们希望得到的小段木头越长越好,请求出 ll 的最大值。

    木头长度的单位是 cmcm,原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。

    例如有两根原木长度分别为 1111 和 2121,要求切割成等长的 66 段,很明显能切割出来的小段木头长度最长为 55。

    输入格式

    第一行是两个正整数 n,kn,k,分别表示原木的数量,需要得到的小段的数量。

    接下来 nn 行,每行一个正整数 LiLi​,表示一根原木的长度。

    输出格式

    仅一行,即 ll 的最大值。

    如果连 1cm1cm 长的小段都切不出来,输出 0

    输入输出样例

    输入 #1

    3 7
    232
    124
    456

    输出 #1

    114

    说明/提示

     分析

    二分答案就是说用 二分 的方法枚举答案,具体请看例子:洛谷 P2440 木材加工

    第一步:找出答案的范围所在即low=0;high=1e8+1;即可将所有答案包含在范围内;

     

    第二步:对答案进行二分;通过check函数判断答案是大是小;

    check函数怎么写呢:需要依次判断每一个原木能切出几个mid,如果切出来的mid大于或者等于输入的k;则return true;否则return false;表示不可行

    第三步:

    二分循环中缩小区间:如果返回是真则mid是较小的,所以需要缩小low,则让low=mid;

    如果返回的是false,则mid较大,无法切出那么多,则需要让mid减小,所以high=mid-1;-1保证循环能出去;

    第四步:以此类推,直到结束条件:low>=high,

    1. #include
    2. #include
    3. #define int long long
    4. using namespace std;
    5. const int N = 1e5 + 10;
    6. int arr[N];
    7. int n, k;
    8. bool check(int x) {
    9. int ans = 0;
    10. for (int i = 0;i < n;i++) {
    11. ans += arr[i] / x;
    12. }
    13. return ans >= k;//若果能切出的结果大于k,则需要增大mid;
    14. }
    15. int search() {
    16. int low = 0;int high = 100000010;
    17. while (low < high) {
    18. int mid = low + high + 1 >> 1;
    19. if (check(mid)) low = mid;
    20. else high = mid-1;
    21. }
    22. return low;
    23. }
    24. signed main()
    25. {
    26. cin >> n >> k;
    27. for (int i = 0;i < n;i++) {
    28. cin >> arr[i];
    29. }
    30. cout << search() << endl;
    31. }

  • 相关阅读:
    linux小妙招(对比不同文件夹下的内容、kill掉后台运行的gdb进程)
    u盘上面 安装 ubuntu 系统
    1040 有几个PAT (分数 25)【C++】
    Linux_进程
    网络安全数字孪生:一种新颖的汽车软件解决方案
    slice切片介绍
    Python移动端自动化
    设计模式----工厂模式
    二叉树汇总
    Ubuntu20单机搭建MongoDB4.2集群详细
  • 原文地址:https://blog.csdn.net/m0_72522122/article/details/127764221