D.複数のテストケース(贪心、dp Educational Codeforces Round 86(Div。2の評価))

D.複数のテストケース

CF 1342D 私はとても怒っています、私はただの天井
です、私の神、wsmは常にこのようなものです、私は投げます、私はとても悲しいです555555555555
ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入ここに画像の説明を挿入

意味:
与えられたn、kn、kn knnを指定n個の配列mi m_iメートル、それらをグループ化するリクエスト。
与えられた(株)kサイズの配列ci c_ic、各グループがii以上である必要がありますiの桁数がci c_i以下であるc
グループanssの最小数を見つけ、各グループに割り当てられた数を出力します。

アイデア:
私は最初にそれについて考えます、唯一の違いがあります天井
最初に最小グループ化数anssを見つけます:mmの場合m配列ソート、dpi dp_id pii以上のレコードiの数、現在のanssはceil(dpi / ci)ceil(dp_i / c_i)です。c e i l d p/ c、anssの最大値を取る

int n;
vector<LL> ans[maxn];
LL m[maxn],c[maxn],dp[maxn],mp[maxn],anss;
int main(){
    
    
    LL n=lrd(),k=lrd();
    anss=0;
    for(int i=1;i<=n;i++){
    
    m[i]=lrd();mp[m[i]]++;}
    sort(m+1,m+1+n);
    for(int i=k;i>=1;i--)dp[i]=dp[i+1]+mp[i];
    for(int i=1;i<=k;i++){
    
    c[i]=ird();anss=max(anss,(dp[i]+c[i]-1)/c[i]);}
    cout<<anss<<endl;
    int nw=0;
    for(int i=n;i>=1;i--){
    
    
        ans[nw].push_back(m[i]);
        nw++;
        nw%=anss;
    }
    for(int i=0;i<anss;i++){
    
    
        cout<<ans[i].size()<<" ";
        for(int j=0;j<ans[i].size();j++)
            cout<<ans[i][j]<<" ";
        cout<<endl;
    }
}

おすすめ

転載: blog.csdn.net/weixin_44986601/article/details/105850994