难度中等
传送带上的包裹必须在 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;
}
这道LeetCode题目要求在D天内将按照特定重量顺序排列的包裹从一个港口运送到另一个港口。通过二分查找法,找到能运送所有包裹并在规定天数内完成的船只最小载重能力。思路涉及二分搜索的终止和移动条件判断。
310

被折叠的 条评论
为什么被折叠?



