标准题解(由GPT 3.5生成)
2024-01-06 09:50:09
发布于:浙江
24阅读
0回复
0点赞
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
bool checkFeasible(const vector<int>& A, int M, int mid) {
int count = 1;
int sum = 0;
for (int i = 0; i < A.size(); i++) {
if (A[i] > mid) {
return false; // 如果存在大于 mid 的元素,则不可行
}
if (sum + A[i] > mid) {
count++; // 开始新的一段
sum = A[i];
} else {
sum += A[i];
}
}
return count <= M; // 判断分成的段数是否小于等于 M
}
int getMinMaxSum(const vector<int>& A, int M) {
int left = *max_element(A.begin(), A.end()); // 最大值的左端点为数列 A 中最大的元素
int right = accumulate(A.begin(), A.end(), 0); // 最大值的右端点为数列 A 的和
int result = right;
while (left <= right) {
int mid = left + (right - left) / 2;
if (checkFeasible(A, M, mid)) {
result = mid;
right = mid - 1; // 缩小最大值的范围
} else {
left = mid + 1; // 扩大最大值的范围
}
}
return result;
}
int main() {
int N, M;
cin >> N >> M;
vector<int> A(N);
for (int i = 0; i < N; i++) {
cin >> A[i];
}
int minMaxSum = getMinMaxSum(A, M);
cout << minMaxSum << endl;
return 0;
}
这里空空如也
有帮助,赞一个