【二分答案】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 @   iiyiyi  阅读(326)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
点击右上角即可分享
微信分享提示