Vison's Blog
所有文章
文章总览
编辑器
Publications
About Me
Search
目录
#toc-container
下载Markdown文件
【4.26】LeetCode每日一题· 在 D 天内送达包裹的能力
2021年04月26日 8时12分
标签:
LeetCode
二分
## 题目描述 传送带上的包裹必须在D天内从一个港口运送到另一个港口。 传送带上的第i个包裹的重量为weights[i]。每一天,我们都会按给出重量的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。 返回能在D天内将传送带上的所有包裹送达的船的最低运载能力。 #### 示例1 ``` 输入:weights = [1,2,3,4,5,6,7,8,9,10], D = 5 输出:15 解释: 船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示: 第 1 天:1, 2, 3, 4, 5 第 2 天:6, 7 第 3 天:8 第 4 天:9 第 5 天:10 请注意,货物必须按照给定的顺序装运,因此使用载重能力为 14 的船舶并将包装分成 (2, 3, 4, 5), (1, 6, 7), (8), (9), (10) 是不允许的。 ``` #### 示例2 ``` 输入:weights = [3,2,2,4,1,4], D = 3 输出:6 解释: 船舶最低载重 6 就能够在 3 天内送达所有包裹,如下所示: 第 1 天:3, 2 第 2 天:2, 4 第 3 天:1, 4 ``` #### 示例3 ``` 输入:weights = [1,2,3,1,1], D = 4 输出:3 解释: 第 1 天:1 第 2 天:2 第 3 天:3 第 4 天:1, 1 ``` #### 提示 ``` 1 <= D <= weights.length <= 50000 1 <= weights[i] <= 500 ``` #### 来源 > 来源:力扣(LeetCode) > 链接:[题目链接](https://leetcode-cn.com/problems/capacity-to-ship-packages-within-d-days "题目链接") ## 解题思路 题目答案具有单调性:如果船的运载能力为`d`时能在`D`天内完成任务,那么对于任何运载能力大于等于`d`的船,都能在`D`天内完成运载任务。 因此对船的装载能力进行二分答案即可。时间复杂度:$$O\left(n\\log(\\sum{w} - \max{w})\right)$$ ## 代码 ```cpp class Solution { public: bool check(vector
& weights, int mid, int D){ int d = 1, tmp = mid; for(int& weight: weights){ if(tmp >= weight){ tmp -= weight; }else{ if(weight > mid) return false; tmp = mid - weight; d++; } } return d <= D; } int shipWithinDays(vector
& weights, int D) { int l = 1, r = 0, mid; for(int i = 0; i < weights.size(); i++){ r += weights[i]; l = max(l, weights[i]); } while(l <= r){ mid = (r - l) / 2 + l; if(check(weights, mid, D)){ r = mid - 1; }else{ l = mid + 1; } } return l; } }; ``` ### 用时和内存 > 执行用时:44 ms,在所有 C++提交中击败了91.21%的用户 > 内存消耗:25.4 MB,在所有 C++提交中击败了74.57%的用户
所有评论
暂无评论
新增评论
评论
邮箱
邮箱仅作验证使用
图形验证码
邮箱验证码
发送验证码
发表评论
所有评论
暂无评论