画匠问题

【题目】

给定整型数组arr,元素表示完成一幅画需要的时间,
给定整数num,表示画匠数,
每个画匠只能画连在一起的画作,所有画匠并行工作,
返回所有完成画作所需要的最少时间。

【例子】

public class demo {
    public static void main(String[] args) {
        int[] arr=new int[]{3,1,4};
        System.out.println(Solution(arr,2));//4,第一个画匠画3和1,第二个画4,最少需要4

        int[] arr1=new int[]{1,1,1,4,3};
        System.out.println(Solution(arr1,3));//4,第一个画匠画111,第二个画4,第三个画3,最少需要4
    }

【代码】

//画匠问题
    //确定需要的画匠数(规定每个画匠画画的时间不能多于limit)
    public static int getNeedNum(int[] arr,int limit){
        int res=1;//画匠数
        int stepSum=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]>limit){//某幅画工作量已经大于limit,退出该方法,调整limit
                return Integer.MAX_VALUE;
            }
            stepSum+=arr[i];//同一个画匠的工作量累加
            if(stepSum>limit){//直到超过limit,则当前的画应分给下一个画匠
                res++;//画匠数加一
                stepSum=arr[i];//重新开始累加工作量
            }
        }
        return res;
    }

    public static int Solution(int[] arr,int num){
        if(arr==null||arr.length==0||num<1){
            throw new RuntimeException("err");
        }
        if(arr.length<num){//arr=[2,3],num=3,直接返回最大的arr[i],即每个画匠画一幅
            int max=Integer.MIN_VALUE;
            for(int i=0;i<arr.length;i++){
                max=Math.max(max, arr[i]);
            }
            return max;
        }
        int minSum=0;
        int maxSum=0;
        for(int i=0;i<arr.length;i++){
            maxSum+=arr[i];//完成所有画作的时间
        }
        while(minSum!=maxSum-1){//二分查找法,比较需要的画匠数和num,调整limit
            int mid=(minSum+maxSum)/2;
            if(getNeedNum(arr,mid)>num){
                //需要的画匠数多了,说明mid小了,增大min
                minSum=mid;
            }
            else{
                maxSum=mid;//mid大了,减小max
            }
        }
        return maxSum;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值