luogu P2985 [USACO10FEB]食べるチョコレートチョコレート食べます

タイトル説明

ベッシーは、N(1 <= N <= 50,000)のチョコレートを得ました。彼女は、チョコレートを食べるための方法を見つけることにチョコレートを食べるために、この時間を作る、など幸せ最も不幸​​な日を決定しました。そして、D(1 <= D <= 50,000)日数の合計を食べます。

あなたはチョコレートの部分を食べる際にチョコレートの各値が幸せH_I(1 <= H_I <= 1,000,000)、一日を持って、あなたは、チョコレートの幸せな作品の値を取得します。幸せな毎日の値は、幸せなチョコレートの合計値であり、すべての日に食べます。ベッシーは毎晩眠りにした後、それが楽しい値が半分になります。そのような50のベッシー幸せ昨日値として言い換えれば、私は今朝目が覚めた、私は、小数点以下の数値を丸め、25ポイントの楽し値を持つことになります。また、ベッシー癖があり、彼女は元の順序に従ってチョコレートを食べるのが好きです。

ベッシー幸せな一日目は、そのようベッシー最も不幸な日と幸せ、0、毎日チョコレートを食べるために解決策を見つけることです。

入力形式

  • 1行目:二つのスペースで区切られた整数:NとD

  • ライン2..N + 1:H_I:ラインI + 1は、単一の整数が含まれています

出力フォーマット

  • 1行目:単一の整数は、最高ベッシーの最小幸福は、次のD日を超えることができ

  • ライン2..N + 1:回線I + 1は、ベッシーは、チョコレートの私を食べた日である整数が含まれています


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int mod=10007,N=5e4+10;
#define int long long
int n,m,h[N],a[N];
inline bool check(int x){
    int op=0,j=0;
    for(int i=1;i<=m;i++){
        op=op>>1;
        while(op<x&&j<n){j++;op+=h[j];a[j]=i;}
        if(op<x)return 0;
    }
    return 1;
}
signed main(){
    cin>>n>>m;
    int l=0,r=10,ans=-1;
    for(int i=1;i<=n;i++)
    scanf("%lld",&h[i]),r+=h[i];
    while(l<=r){
        int mid=(l+r)>>1;
        if(check(mid)){
            l=mid+1;
            ans=mid;
        }else r=mid-1;
    }
    cout<<ans<<endl;
    memset(a,0,sizeof(a));
    check(ans);
    for(int i=1;i<=n;i++)
    if(a[i])printf("%lld\n",a[i]);
    else printf("%lld\n",m);
}

おすすめ

転載: www.cnblogs.com/naruto-mzx/p/11781239.html