Run ID 作者 问题 语言 测评结果 时间 内存 代码长度 提交时间
91686 sh25_shenpy 复制书稿 C++ 通过 0 MS 256 KB 1669 2026-06-14 14:38:42

Tests(1/1):


#include <iostream> #include <vector> #include <algorithm> using namespace std; const int MAXM = 505; int page[MAXM]; int m, k; // 检验:限制每人最多抄lim页,至少需要多少人 int check(int lim) { int cnt = 1; int sum = 0; for (int i = 1; i <= m; ++i) { if (sum + page[i] > lim) { cnt++; sum = page[i]; } else { sum += page[i]; } } return cnt; } int main() { cin >> m >> k; int left = 0, right = 0; for (int i = 1; i <= m; ++i) { cin >> page[i]; left = max(left, page[i]); right += page[i]; } // 二分答案,求最小的最大页数 int ans = right; while (left <= right) { int mid = (left + right) / 2; int need = check(mid); if (need <= k) { ans = mid; right = mid - 1; } else { left = mid + 1; } } // 从后往前贪心分段,保证前面的人书更少 vector<pair<int, int>> seg; int now = m; int sum = 0; for (int i = k; i >= 1; --i) { int ed = now; sum = 0; // 尽可能往前取,不超过ans while (now >= 1 && sum + page[now] <= ans) { sum += page[now]; now--; } seg.emplace_back(now + 1, ed); } // 反转,按顺序输出 reverse(seg.begin(), seg.end()); for (auto& p : seg) { cout << p.first << " " << p.second << endl; } return 0; }


测评信息: