LLL
2025-10-07 20:09:55
发布于:四川
1阅读
0回复
0点赞
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
const int MAXN = 100010;
long long a[MAXN];
int n, m;
// 判断是否可以用最大段和不超过 lv 的方式分成不超过 m 段
bool check {
int segments = 1;
long long current_sum = 0;
for (int i = 1; i <= n; ++i) {
if ( return false; // 单个元素超限
[i] <= limit) {
current_sum += a[i];
} else {
current_sum = a[i];
segments++;
}
}
return segments <= m;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
long long left = 1, a + n + 1); // 至少要容纳最大值
long long right = accumulate(a + 1, a + n + 1, 0LL); // 最多是总和
long long ans = right;
while (left <= right) {
long long mid = left + (right - left) / 2;
if (check(mid)) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
cout << ans << endl;
return 0;
}
这里空空如也







有帮助,赞一个