| Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
|---|---|---|---|---|---|---|---|---|---|
| 436399 | 顾鑫辰 | 【C6-T】数列分段 | C++ | 通过 | 100 | 2 MS | 264 KB | 1452 | 2026-04-14 16:38:39 |
#include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXN = 100005; long long a[MAXN]; // 存储数列 int n, m; // n个数,分成m段 // 判断:当每段和不超过mid时,能否分成 <= m 段 bool check(long long mid) { long long sum = 0; // 当前段的和 int cnt = 1; // 统计需要几段,初始至少1段 for (int i = 1; i <= n; i++) { if (sum + a[i] <= mid) { // 还能装,继续加 sum += a[i]; } else { // 装不下,新开一段 cnt++; sum = a[i]; // 如果段数超了,直接返回false if (cnt > m) return false; } } return true; } int main() { cin >> n >> m; long long l = 0, r = 0; // 二分左右边界 for (int i = 1; i <= n; i++) { cin >> a[i]; l = max(l, a[i]); // 左边界:数列最大值(下限) r += a[i]; // 右边界:总和(上限) } // 二分查找答案 while (l < r) { long long mid = (l + r) / 2; if (check(mid)) { // 可行,尝试更小的值 r = mid; } else { // 不可行,需要更大的值 l = mid + 1; } } // 输出最终答案 cout << l << endl; return 0; }