[Usaco2010]Chocolate Eating
2017-09-26 19:36
92 查看
Description
贝西从大牛那里收到了N块巧克力。她不想把它们马上吃完,而是打算制定一个计划,使得在接下来的D天里,她能够尽量地快乐。贝西的快乐指数可以用一个整数来衡量,一开始的时候是0,当她每天晚上睡觉的时候,快乐指数会减半(奇数时向下取整)。贝西把她的巧克力按照收到的时间排序,并坚持按照这个顺序来吃巧克力。当她吃掉第i块巧克力的时候,她的快乐指数会增加Hj。每天可以吃任意多块巧克力,如何帮助贝西合理安排,使得D天内她的最小快乐指数最大呢?
举个例子:假设一共有五块巧克力,贝西打算在五天时间内将它们吃完,每块巧克力提供的快乐指数分别为10,40,13,22,7。则最好的方案如下:
五天内的最小快乐指数为24,这是所有吃法中的最大值。
Input
第一行:两个用空格分开的整数:N和D,1≤N,D≤50000
第二行到第N+1行:第i+1行表示第i块巧克力提供的快乐指数Hi,1≤Hi≤1000000
Output
第一行:单个整数,表示贝西在接下来D天内的最小快乐指数的最大值。
第二行到第N+1:在第i+1行有一个整数,代表贝西应该在哪一天吃掉第i块巧克力。
如果有多种吃法,则输出按照词典序排序后最靠后的方案。
Sample Input
55
10
40
13
22
7
Sample Output
24
1
1
3
4
5
HINT
Source
Silver
方法
二分答案,每次想办法维持当前这个答案,如果维持不了那么说明不可以达到,否则则可以。
代码
贝西从大牛那里收到了N块巧克力。她不想把它们马上吃完,而是打算制定一个计划,使得在接下来的D天里,她能够尽量地快乐。贝西的快乐指数可以用一个整数来衡量,一开始的时候是0,当她每天晚上睡觉的时候,快乐指数会减半(奇数时向下取整)。贝西把她的巧克力按照收到的时间排序,并坚持按照这个顺序来吃巧克力。当她吃掉第i块巧克力的时候,她的快乐指数会增加Hj。每天可以吃任意多块巧克力,如何帮助贝西合理安排,使得D天内她的最小快乐指数最大呢?
举个例子:假设一共有五块巧克力,贝西打算在五天时间内将它们吃完,每块巧克力提供的快乐指数分别为10,40,13,22,7。则最好的方案如下:
天数 | 起床时快乐指数 | 食用的巧克力 | 就寝时快乐指数 |
---|---|---|---|
1 | 0 | 10+40 | 50 |
2 | 25 | 25 | |
3 | 12 | 13 | 25 |
4 | 12 | 22 | 34 |
5 | 17 | 7 | 24 |
Input
第一行:两个用空格分开的整数:N和D,1≤N,D≤50000
第二行到第N+1行:第i+1行表示第i块巧克力提供的快乐指数Hi,1≤Hi≤1000000
Output
第一行:单个整数,表示贝西在接下来D天内的最小快乐指数的最大值。
第二行到第N+1:在第i+1行有一个整数,代表贝西应该在哪一天吃掉第i块巧克力。
如果有多种吃法,则输出按照词典序排序后最靠后的方案。
Sample Input
55
10
40
13
22
7
Sample Output
24
1
1
3
4
5
HINT
Source
Silver
方法
二分答案,每次想办法维持当前这个答案,如果维持不了那么说明不可以达到,否则则可以。
代码
#include <cstdio> const long long maxn=50000; long long n,d,h[maxn+10],v[maxn+10],left,right,ans; long long check(long long lim,long long mode) { long long en=0,now=0; for(long long i=1; i<=d; i++) { en/=2; while(en<lim) { now++; if(now>n) { return 0; } en+=h[now]; if(mode) { v[now]=i; } } } return 1; } int main() { scanf("%lld%lld",&n,&d); for(long long i=1; i<=n; i++) { scanf("%lld",&h[i]); right+=h[i]; } while(left<=right) { long long mid=(left+right)>>1; if(check(mid,0)) { ans=mid; left=mid+1; } else { right=mid-1; } } check(ans,1); printf("%lld\n",ans); for(long long i=1; i<=n; i++) { if(v[i]) { printf("%lld\n",v[i]); } else { printf("%lld\n",d); } } return 0; }
相关文章推荐
- BZOJ 1829 [Usaco2010 Mar]starc星际争霸 ——半平面交
- 离散化+区间更新+最大结点统计(或优先队列)——[usaco2010 Oct]Soda Machine
- BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会
- BZOJ 1778 Usaco2010 Hol Dotp 驱逐猪猡 期望DP+高斯消元
- 2015: [Usaco2010 Feb]Chocolate Giving
- 【计算几何】【极角序】【二分】bzoj1914 [Usaco2010 OPen]Triangle Counting 数三角形
- 【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 贪心 树规
- bzoj 2016: [Usaco2010]Chocolate Eating (二分)
- [BZOJ2016][Usaco2010]Chocolate Eating(二分)
- BZOJ 1776: [Usaco2010 Hol]cowpol 奶牛政坛 贪心lca/点分治
- 【LCA】BZOJ1776-[Usaco2010 Hol]cowpol 奶牛政坛
- bzoj:1776: [Usaco2010 Hol]cowpol 奶牛政坛
- bzoj 1914: [Usaco2010 OPen]Triangle Counting 数三角形——极角排序
- 【BZOJ】2014: [Usaco2010 Feb]Chocolate Buying(贪心)
- bzoj2102 [Usaco2010 Dec]The Trough Game
- BZOJ 1914: [Usaco2010 OPen]Triangle Counting 数三角形
- 【BZOJ】1827: [Usaco2010 Mar]gather 奶牛大集会(树形dp)
- 【USACO Contest 】Holiday 2010 Bonus Competition, Problem 2: Rocks and Trees (rocks)
- bzoj 1783: [Usaco2010 Jan]Taking Turns
- BZOJ2101 [Usaco2010 Dec]Treasure Chest 藏宝箱