码迷,mamicode.com
首页 > 其他好文 > 详细

【二分答案】BZOJ2016-Chocolate Eating

时间:2016-08-15 14:20:04      阅读:118      评论:0      收藏:0      [点我收藏+]

标签:

【题目大意】

n块巧克力,每次吃可以增加ai点快乐,每天早晨睡觉起来快乐值会减半,求如何使d天睡觉前的最小快乐值最大。

【思路】

二分每天的最小快乐值,只要没有达到快乐值就继续吃。

不知道为什么了WA了8发..8发??!!!!说好的水题呢??!!!而且我也不知道哪里错了反正突然AC了??!!

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const int MAXN=100000+50;
 7 typedef long long ll;
 8 int n,d;
 9 ll h[MAXN];
10 ll ans[MAXN],tmp[MAXN];
11 ll ansx;
12 
13 void init()
14 {
15     scanf("%d%d",&n,&d);
16     for (int i=1;i<=n;i++) scanf("%lld",&h[i]);
17 } 
18 
19 int check(ll x)
20 {
21     int j=1;
22     ll sum=0;
23     for (int i=1;i<=d;i++)
24     {
25         while (sum<x && j<=n)
26         {
27             tmp[j]=i;
28             sum+=h[j++];
29         } 
30         if (sum<x) return 0;
31         sum>>=1;
32     }
33     while (j<=n) tmp[j++]=d;
34     for (int i=1;i<=n;i++) ans[i]=tmp[i];
35     ansx=x;
36     return 1;
37 }
38 
39 void solve()
40 {
41     ll lb=1,ub=50000000000ll;
42     while (lb<=ub)
43     {
44         ll mid=(lb+ub)>>1;
45         if (check(mid)) lb=mid+1;else ub=mid-1;
46     }
47     printf("%lld\n",ansx);
48     for (int i=1;i<=n;i++) 
49         printf("%lld\n",ans[i]); 
50 }
51 
52 int main()
53 {
54     init();
55     solve();
56     return 0;
57 } 

 

【二分答案】BZOJ2016-Chocolate Eating

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/5772612.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!