題目:抄m本書,書的編號是連續的,現在要把這些書,按照連續編號分成k組,
每本書有頁數,使得頁數和最大的那組總頁數最小,輸出方案。
分析:貪心、二分。利用二分頁數總和,貪心判斷最少需要的組數。
輸出答案是從後向前組合即可,這裡也是貪心。
說明:900題了╮(╯▽╰)╭。
#include <stdio.h>
int page[505];
int part(long long length, int m)
{
for (int i = m-1; i >= 0; -- i) {
if (length < page[i]) {
return m+1;
}
}
long long sum = 0LL;
int count = 1;
for (int i = m-1; i >= 0; -- i) {
if (sum + page[i] > length) {
sum = 0;
count ++;
}
sum += page[i];
}
return count;
}
void output(long long length, int m, int k)
{
long long sum = page[m];
int s = m-1;
while (s >= k && sum + page[s] <= length) {
sum += page[s --];
}
if (s >= 0) {
output(length, s, k-1);
printf(" / ");
}
for (int i = s+1; i < m; ++ i) {
printf("%d ", page[i]);
}
printf("%d", page[m]);
}
int main()
{
int n, m, k;
scanf("%d", &n);
while (n --) {
scanf("%d%d", &m, &k);
long long mid = 0LL, left = 0LL, right = 0LL;
for (int i = 0; i < m; ++ i) {
scanf("%d", &page[i]);
right = right + page[i];
}
// 二分
while (left < right) {
mid = left + (right-left)/2;
if (part(mid, m) > k) {
left = mid+1;
}else {
right = mid;
}
}
output(left, m-1, k-1);
puts("");
}
return 0;
}