D. Multiple Testcases(贪心、dp Educational Codeforces Round 86 (Rated for Div. 2))

D. Multiple Testcases

CF 1342D
气死我了我就差一个ceil我的天wsm老这样我吐了我好难过555555555555
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

题意:
给定 n 、 k n、k nk,给定 n n n个数组 m i m_i mi,要求将其分组。
给定 k k k大小的数组 c i c_i ci,要求每个组中大于等于 i i i的数字个数小于等于 c i c_i ci
求最小分组数anss,并输出每个分组内分配的数字。

思路:
一开始想的已经差不多了,就差一个ceil
先求出最小分组数anss:对 m m m数组排序, d p i dp_i dpi记录大于等于 i i i的数字个数,当前的anss就是 c e i l ( d p i / c i ) ceil(dp_i/c_i) ceil(dpi/ci),对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
今日推荐