- 题目大意
有m本书,k个人来抄,每本书有一个书本页数;求使得k个人抄完的最大页数最小,并且每个人都至少要抄一本,然后输出抄书的方案 。
- 解题思路
这是个最大值中的最小值问题,先用二分+贪心算出一个最大页数的最小值(在二分的过程中,我们对于当前考虑的值 x 划分人数的贪心过程中,我们就有flag[i]去标记,这个位置应该划分开即可)。
- 代码
#include<iostream> #include<cstring> using namespace std; const int MAX = 501; int num[MAX]; bool vis[MAX]; int t, n,g; int find(long long a) { long long sum = 0, count = 1; memset(vis, false, sizeof(vis)); for (int i = n - 1; i >= 0; i--) { sum += num[i]; if (sum > a) { count++; sum = num[i]; vis[i] = true; } } return count; } int main() { cin >> t; while (t--) { int max = 0; cin >> n>>g; long long l = 0, r = 0; for (int i = 0; i < n; i++) { cin >> num[i]; if (num[i] > l) l = num[i]; r+= num[i]; } long long m; while (l < r) { m = (l + r) / 2; if (find(m) <= g) r = m; else { l = m + 1; } } max=find(r); for (int i = 0; i < n&&max < g; i++) { if (!vis[i]) { vis[i] = true; max++; } } cout << num[0]; for (int i = 1; i < n; i++) { if (vis[i - 1]) cout << " /"; cout << ‘ ‘ << num[i]; } cout << endl; } return 0; }