ZOJ 2002 Copying Books(二分答案)
2013-07-08 12:06
344 查看
最大值最优化问题, 二分答案.
每次二分的时候从后往前分配书即可满足条件.
每次二分的时候从后往前分配书即可满足条件.
#include <iostream> #include <cstdio> #include <memory.h> using namespace std; const int maxn = 510; long long P[maxn]; bool Div[maxn], tmp[maxn]; int N, K; int main(){ int nCase; scanf("%d", &nCase); while (nCase--){ long long l = 0, r = 0; scanf("%d%d", &N, &K); for (long long i = 0; i < N; ++i){ scanf("%lld", &P[i]); r += P[i]; } memset(Div, 0, sizeof(Div)); while (l <= r){ long long mid = (l + r) >> 1; memset(tmp, 0, sizeof(tmp)); int i = N - 1, tk = K - 1, f = 0; for (; i >= 0 && tk >= 0; ){//从后往前分配. long long sum = 0; //当前人能够分到的最多数量 int j = i; while(j >= 0 && sum <= mid && j >= tk){//要留下至少tk本书给剩下的tk个人 if(sum + P[j] <= mid){ sum += P[j--]; }else{ break; } } if(i == j)break;//第一本书就超过了mid,不可行 i = j; if(i >= 0)tmp[i] = 1; --tk; } if(i >= 0){ l = mid + 1; }else{ memcpy(Div, tmp, sizeof(tmp));//更优的解 r = mid - 1; } } for (long long i = 0; i < N; ++i){ printf("%lld", P[i]); if(Div[i])printf(" / "); else if(i + 1 != N)printf(" "); } printf("\n"); } return 0; }
相关文章推荐
- ZOJ 2002 Copying Books 二分 贪心
- ZOJ 2002 Copying Books 二分 贪心
- ZOJ-2002 Copying Books
- BZOJ2547 CTSC2002玩具兵(最短路径+二分答案+最大流)
- UVa 714 Copying Books - 二分答案
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- ZOJ2002 Copying Books
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- [ZOJ 2112] Dynamic Rankings [块状链表+二分答案+二分查找]
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- ZOJ 2112 动态区间第K大(二分答案+线段树套Treap)
- UVa 714 & POJ 1505 & ZOJ 2002 - Copying Books
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- UVa 714 - Copying Books 二分答案
- ZOJ 3368 Trick or Treat(二分答案)
- [最小极差生成树 LCT || 二分答案 CDQ分治 并查集] Ural 2055 Urban Geography
- HDU 4430 & ZOJ 3665 Yukari's Birthday(二分+枚举)
- bzoj 1532 二分答案+最大流判断
- hdu 2295 Radar (二分答案+重复覆盖)
- stone二分答案