华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题,

因为搜索范围是有界的,上界=最大木板长度+补充的全部木料长度,下界=最小木板长度;

即left=0,right=10^6;

我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功(补充的木料数<=m),说明还有继续上升的空间,那么就扩大x的范围(left=mid),否则就缩小范围(right=mid-1),直到搜索结束(left=right),此时left就是木板经过补充后的最小值。

java 复制代码
public class Test15 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while(scanner.hasNext()) {
            // 原木板长度
            int n = scanner.nextInt();
            // 要补充的木板长度
            int m = scanner.nextInt();
            int[] arr = new int[n];
            for(int i =0;i<n;i++){
                arr[i] = scanner.nextInt();
            }
            System.out.println(solution(arr, n, m));
        }
    }

    private static int solution(int[] arr, int n, int m) {
        int left = 0,right= (int)1e9;
        while(left<right){
            int mid = left + (right-left+1)/2;//向上取整,防止left=mid出现死循环
            if(canReach(arr,mid,m)){
                left = mid; // 可行,尝试更大值
            }else{
                right = mid - 1; // 不可行,缩小上界
            }
        }

        return left;
    }

    private static boolean canReach(int[] arr, int mid,int m) {
        long need = 0;
        for(int a:arr){
            if(a<mid){
                need += mid -a;
            }
        }
        return need<=m;
    }

}
相关推荐
小严家几秒前
Java基础教程大全完整学习路径
java·开发语言·学习
毕设源码-朱学姐1 分钟前
【开题答辩全过程】以 基于Java的电影推荐系统为例,包含答辩的问题和答案
java·开发语言
sheji34167 分钟前
【开题答辩全过程】以 基于SSM的校园新冠疫苗接种信息管理系统为例,包含答辩的问题和答案
java·开发语言
菜鸟233号8 分钟前
力扣78 子集 java实现
java·数据结构·算法·leetcode
dddaidai12317 分钟前
深入JVM(四):垃圾收集器
java·开发语言·jvm
BBB努力学习程序设计23 分钟前
Java方法(函数)完全指南:初学者的第一个"工具箱"
java
AI科技星29 分钟前
圆柱螺旋运动方程的一步步求导与实验数据验证
开发语言·数据结构·经验分享·线性代数·算法·数学建模
laocooon52385788634 分钟前
python 收发信的功能。
开发语言·python
xixixi7777734 分钟前
STIX/TAXII:网络威胁情报的“普通话”与“顺丰快递”
开发语言·安全·php·威胁·攻击检测·stix·taxii
爬山算法37 分钟前
Netty(19)Netty的性能优化手段有哪些?
java·后端