LeetCode 每日一题 2021-4-26 (在 D 天内送达包裹的能力)

这道LeetCode题目要求在D天内将按照特定重量顺序排列的包裹从一个港口运送到另一个港口。通过二分查找法,找到能运送所有包裹并在规定天数内完成的船只最小载重能力。思路涉及二分搜索的终止和移动条件判断。

1011. 在 D 天内送达包裹的能力

难度中等

传送带上的包裹必须在 D 天内从一个港口运送到另一个港口。

传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。

返回能在 D 天内将传送带上的所有包裹送达的船的最低运载能力。

思路:

最终目标为在给定运输次数中运完全部货物,且需要得到的船的容量为最小。

可以利用二分法求得满足运输次数的最小容量问题(左边界问题):

初始条件如下:

① 最小容量-每艘船单独运送一份货物(单份货物最大重量);

② 最大容量-一艘船运送完全部的货物。

左边界问题:

① 终止条件-最小容量>=最大容量;

② 移动条件-   运输次数>=需求:  right=mid;

                       运输次数<需求:   left = mid +1 .

代码:

int shipWithinDays(vector<int>& weights, int D) {
    int left = *max_element(weights.begin(), weights.end());
    int right = accumulate(weights.begin(), weights.end(), 0);
    while(left<right){
        int mid = left + (right-left)*0.5;
        int cur=0, ship=1;
        for(auto index:weights){
            cur+=index;
            if(cur>mid){
                cur=index;
                ship ++;
            }
        }
        if(ship<=D){
            right = mid;
        }else{
            left = mid+1;
        }
    }
    return left;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值