题面
你需要从皮带输送机按顺序(i=0,1,…,n−1)得到 n 包wi kg的包裹。 你应该将所有包裹装载到 k 辆具有共同最大载荷P 的卡车上。每辆卡车都可以从皮带输送机上装载连续的包裹(大于或等于零),序列中的包裹总重量不得超过最大载荷P。
编写一个程序,读取 n、k和 wi,并报告最大负载 P 的最小值以装载所有包裹。
输入
在第一行中,两个整数 n 和 k 由空格字符分隔。 在接下来的n行中,分别给出了wi。
输出
在一行中打印 P 的最小值。
数据范围
1≤n≤100,000
1≤k≤100,000
1≤wi≤10,000
输入样例
5 3 8 1 7 3 9
输出样例
10
#include <iostream>
#include <vector>
#include <algorithm>
bool isFeasible(const std::vector<int>& weights, int k, int P) {
int count = 1;
int totalWeight = 0;
for (int i = 0; i < weights.size(); ++i) {
if (weights[i] > P) {
return false;
}
if (totalWeight + weights[i] > P) {
count++;
totalWeight = weights[i];
} else {
totalWeight += weights[i];
}
}
return count <= k;
}
int findMinimumLoad(const std::vector<int>& weights, int k) {
int left = 1;
int right = 0;
for (int i = 0; i < weights.size(); ++i) {
right += weights[i];
}
int result = right;
while (left <= right) {
int mid = left + (right - left) / 2;
if (isFeasible(weights, k, mid)) {
result = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return result;
}
int main() {
int n, k;
std::cin >> n >> k;
std::vector<int> weights(n);
for (int i = 0; i < n; ++i) {
std::cin >> weights[i];
}
int minimumLoad = findMinimumLoad(weights, k);
std::cout << minimumLoad << std::endl;
return 0;
}