UVa 714

来源:互联网 发布:vb mac 编辑:程序博客网 时间:2024/06/01 07:56

題目:抄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;}



0 0
原创粉丝点击