Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
436399 顾鑫辰 【C6-T】数列分段 C++ 通过 100 2 MS 264 KB 1452 2026-04-14 16:38:39

Tests(10/10):


#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; }


测评信息: