提交时间:2025-01-04 16:22:31

运行 ID: 59992

#include <bits/stdc++.h> using namespace std; int main() { int n, m; scanf("%d%d", &n, &m); vector<int> a(n); int l = 0, r = 0; for (int i = 0; i < n; i++) //for (int i = 1; i <= n; i++),会导致数组越界应该从 i = 0 开始遍历(会错过第一个元素 a[0],并且在 i = n 时会访问到 a[n],这会导致数组越界RE) { scanf("%d", &a[i]); l = max(l, a[i]);//更新l为数组中的最大值,r为数组所有元素的和 r += a[i]; } while (l < r) { int mid = l + (r - l) / 2; int sum = 0, baka = 1; //最后一段也需要计数 for (int i = 0; i < n; i++) { if (sum + a[i] > mid) { sum = a[i]; baka++; } else { sum += a[i]; } } if (baka > m) { l = mid + 1; // 分段多,说明mid太小,增大l } else { r = mid; //段数少,说明数太大,要改小一点 } } printf("%d\n", l); return 0; }