P2985 [USACO10FEB] Chocolate Eating S
题解
看到使最不开心的一天尽可能的开心,这是要使最小值尽可能的不小,二分思路由此而来,剩余的就是贪心模拟
最坏时间复杂度约为 $ O(d·sum(H)) ≈ 5·10^4 · log2(5·10^{10}) ≈ 1777060.45$
坑点:剩下的巧克力要在最后一天全部吃完
\(Code\)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll sum[50005]={0},a[50005]={0},ans[50005]={0};
int main()
{
ll n,d,r=0,l=0;
cin>>n>>d;
for(ll i=1;i<=n;i++) {cin>>a[i];r+=a[i];}
r+=1;
while(l<r-1)
{
int it=1,i;
ll mid=(r-l)/2+l;
for(i=1;i<=d;i++)
{
sum[i]=sum[i-1]/2;
while( sum[i]<mid && it<=n) sum[i]+=a[it++];
if(sum[i]<mid) break;
}
if(i==d+1)l=mid;
else r=mid;
}
cout<<l<<endl;
int it=1;
for(int i=1;i<=d;i++)
{
sum[i]=sum[i-1]/2;
while(sum[i]<l && it<=n) {ans[it]=i;sum[i]+=a[it++];}
}
while(it<=n)ans[it++]=d;
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
return 0;
}

浙公网安备 33010602011771号