数组leetcode1011. 在 D 天内送达包裹的能力

问题:

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。
传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。
返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days

解题思路:

  1. 船的最低运载能力必然在(max(weights[i]),sum(weights[i])之间,而且是单调的,所以最简单的方法是枚举,为提高效率,采用二分查找;
  2. 如何判断船的运载能力n,能否在D 天内将传送带上的所有包裹送达:首先对于每艘船采用贪心策略装到装不下为止;可以对货物进行遍历,得到运送完货物需要的天数,假如不大于D,表明满足要求

代码:

class Solution {
    public static int shipWithinDays(int[] weights, int D) {      
    	int lo=1;
        int hi=500;
        int mid=0;
        int w=0;
        for (int weight:weights){
            w +=weight;
        }
        mid=w;
        while(lo<hi){
            
            if(canShip(weights,D,mid)){
                hi=mid;
            }
            else{
                lo=mid+1;
            }
            mid=(lo+hi)/2;
        } 
        
        return mid;
    }
    public static boolean canShip(int [] weights,int D,int w){        
        int i;
        int cur =w;
        for (i=0;i<weights.length;i++){
        	if(weights[i]>w)
        		return false;
            if(cur<weights[i]){
            	 D--;
                 cur =w;
            }            	
            cur -=weights[i];                           
            if (D<=0){
                break;
            }
        
        }
        return  i==weights.length;
    }   
    public static void main(String [] args){
        int [] weights={1,2,3,4,5,6,7,8,9,10};
        //boolean t=canShip(weights, 5, 14);
        //System.out.println(t);
        int minw=shipWithinDays(weights,5);
        System.out.println(minw);
    }   
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值