本题抽象出来问题就是410题目,再次抽象就是搜索最小的那个容量使得可以在D天内完成运载。
而每次容量是若干批次中最大的序列,可以说是求最大序列最小容量。
由于每次我们可以根据容量进行划分,例如:当当前容量在D天内不能运载,那么便需要提升每天容量上限,如果当前容量能够在D天内运载,不断缩小容量,直到最后,便是我们要求的最低容量。
这就是二分。
C++ 代码
class Solution {
public:
int shipWithinDays(vector<int>& weights, int D) {
int left = 0x3f3f3f3f, right = 0;
for (auto w : weights) {
left = min(left, w);
right += w;
}
while (left < right) {
int mid = left + right >> 1;
if (check(weights, mid, D)) { // 在D天内可以完成最低运载能力
right = mid;
} else {
left = mid + 1;
}
}
return left;
}
// 检查当前最大容量为mid时,是否可以在D天内运载
bool check(vector<int>& weights, int mid, int D) {
int day = 0;
for (int i = 0; i < weights.size(); i++) {
int j = i;
int sum = 0;
while (j < weights.size() && weights[j] + sum <= mid) {
sum += weights[j++];
}
day++;
if (day > D) return false;
i = j - 1;
}
return true;
}
};