题目:
题解:
- 使用二分法的模板二,二分区间为[包裹的最大值,包裹的总重量],每次二分需要根据mid来计算需要的天数,若天数小于等于D,表示mid值取得过大了,我们需要向左逼近区间[left,mid];若天数大于D,表示mid取得较小,我们需要向右逼近区间[mid+1,right]。
代码如下:
class Solution {
public:
//思路:二分法,二分区间为[包裹的最大值,包裹的总重量]
int shipWithinDays(vector<int>& weights, int D) {
int left=*max_element(weights.begin(),weights.end()),right=accumulate(weights.begin(),weights.end(),0);
while(left<right){
//mid表示最低载重,count表示运送天数
int mid=left+((right-left)>>1);
int count=1,m=mid;
for(int &w:weights){
if(m-w>=0){
m-=w;
}
else{
m=mid-w;
count++;
}
}
//count小于等于D,最低载重mid取大了,我们需要向左边逼近[left,mid]
if(count<=D)right=mid;
//count大于D,最低载重mid取小了,向右边区间逼近[mid+1,right]
else left=mid+1;
}
return left;
}
};