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

17 篇文章 0 订阅
1 篇文章 0 订阅

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值