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;
}
posted @ 2024-02-09 20:55  纯粹的  阅读(70)  评论(0)    收藏  举报