难度:中等。
标签:数组,二分查找。
看了下题解,就懂了。
枚举可能的装载重量,通过二分法来查找可在D天内完成运输的最小装载重量。
最小装载重量是max(最大重量的物体重量,ceil(所有物体重量和/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;
}
};
结果:

这篇博客探讨了一个利用二分查找算法解决货物在限定天数内运输的问题。核心思路是枚举装载重量,并通过二分查找找到最小装载重量。最小装载重量是最大物体重量与所有物体重量和除以天数向上取整中的较大值。博客提供了正确的解决方案,展示了如何在C++中实现这一算法。
222

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



