难度:中等。
标签:数组,二分查找。
看了下题解,就懂了。
枚举可能的装载重量,通过二分法来查找可在D天内完成运输的最小装载重量。
最小装载重量是
m
a
x
(
最
大
重
量
的
物
体
重
量
,
c
e
i
l
(
所
有
物
体
重
量
和
/
D
)
)
max(最大重量的物体重量,ceil(所有物体重量和/D))
max(最大重量的物体重量,ceil(所有物体重量和/D)),ceil是向上取整。
最大装载重量是所有物体重量和。
正确解法:
class Solution {
bool canShipinD(vector<int>& weights, int D, int m){
int now_weight = 0;
for(int i = 0; i < weights.size(); ++i){
if(now_weight + weights[i] > m){
D--;
if(D <= 0)return false;
now_weight = weights[i];
}
else{
now_weight += weights[i];
}
}
return true;
}
public:
int shipWithinDays(vector<int>& weights, int D) {
int n = weights.size();
int left_weight = 0, right_weight = 0;
for(int i = 0; i < n; ++i){
left_weight = max(left_weight, weights[i]);
right_weight += weights[i];
}
if(D == n)return left_weight;
left_weight = max((right_weight + D - 1) / D, left_weight);
int left = left_weight, right = right_weight, ans = right_weight;
while(left <= right){
int mid = (left + right) / 2;
if(canShipinD(weights, D, mid)){
ans = mid;
right = mid - 1;
}
else{
left = mid + 1;
}
}
return ans;
}
};
结果: