5.8
洛谷P2985 [USACO10FEB]Chocolate Eating S
最小的开心度越大,吃的巧克力数就越多。
#include<iostream>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll n,day,q[50010],d[50010];
ll l=-1,r=1e13;
bool check(ll x){
ll cnt=0,sum=0,i;
for(i=1;i<=day;i++){
sum/=2;
while(sum<x){
sum+=q[++cnt]; //二分的开心度不是最小时就吃
if(cnt>n) return false;
if(x&&x==l) d[cnt]=i;//当取到答案时,才记录吃的日子
}
}
return true;
}
int main()
{
cin>>n>>day;
for(int i=1;i<=n;i++)
cin>>q[i];
while(l+1<r){
ll mid=(l+r)/2;
if(check(mid))
l=mid;
else
r=mid;
}
cout<<l<<endl;
check(l);
for(int i=1;i<=n;i++)
if(d[i]) cout<<d[i]<<endl;
else cout<<day<<endl; //没吃完的都要在最后一天吃完
return 0;
}
//要把我干碎了,这题。。