【二分答案】BZOJ2016-Chocolate Eating

【题目大意】

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 } 

 

posted @ 2016-08-15 13:36  iiyiyi  阅读(324)  评论(0编辑  收藏  举报