UVA714CopyingBooks
来源:互联网 发布:邮件大师 mac 编辑:程序博客网 时间:2024/06/08 17:12
//UVA714CopyingBooks#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>using namespace std;const int MAXN = 500 + 10;int n, k, N;int p[MAXN];int solve(int ans) {long long done = 0, part = 1;for(int i = 0; i < n; i++) {if(done + p[i] <= ans) done += p[i];else { done = p[i]; part++; }}return part;}void print(long long ans) {//printf("ans = %d\n", ans);int slash[MAXN] = {0};long long done = 0, left = k - 1;//left标记剩余的斜杠数 for(int i = n - 1; i >= 0; i--) {//反向来,同样是贪心 if(done + p[i] <= ans) done += p[i];else {slash[i] = 1; done = p[i]; left--; //标记分隔号的位置,在当前元素前面,便于打印,更新累加器done }}for(int i = 0; i < n && left; i++) if(!slash[i]) { left--; slash[i] = 1;}for(int i = 0; i < n - 1; i++) {printf("%d ", p[i]);if(slash[i]) printf("/ ");} printf("%d\n", p[n - 1]);}int main() {//freopen("UVA714out.txt", "w", stdout);scanf("%d", &N);while(N--) {int maxd = 0;long long tot = 0;scanf("%d%d", &n, &k);for(int i = 0; i < n; i++) {scanf("%d", &p[i]);maxd = max(maxd, p[i]);tot += p[i];} long long L = maxd, R = tot; while(L < R) {//二分子序列总和的上界 long long M = L + (R - L) / 2;if(solve(M) <= k) R = M;else L = M + 1;}print(L);}return 0;} /*29 3100 200 300 400 500 600 700 800 9005 4100 100 100 100 100*/
阅读全文
0 0
- UVA714CopyingBooks
- 算法-排序之快速排序
- 【bzoj2079】 [Poi2010]Guilds
- 有关Android Studio布局文件的视图皮肤丢失该如何找回
- vue-router 快速入门
- 接受网络消息后弹框
- UVA714CopyingBooks
- 支付宝联合我的天科技 AR技术助力杭州海外参展
- UIGestureRecognizer 手势识别
- Linux 文件系统扩展属性(对文件进行锁定)
- Java设计模式10——外观模式
- C_栈的应用----行编辑程序
- 15. 3Sum
- 常用设计模式一(创建型模式)
- Android TranslateAnimation实现View的显示与隐藏动画