zoukankan      html  css  js  c++  java
  • Codeforces 723c [贪心][乱搞]

    /*
    不要低头,不要放弃,不要气馁,不要慌张。
    题意:
    给一个n和m。
    第二行给n个数。
    每次操作可以把n个数中的任何一个数替代为别的数,问最少的操作次数使得1.2.3.4.5...m中的数出现的次数的最小值尽可能大。
    输出这个数,输出最少操作次数,输出替换后的数组。
    思路:
    1.显然,最小值尽可能大,这个值是可以确定的,即n/m;
    2.还有,为使得操作次数最少,我们发现最多有n%m个没有贡献的无关值无需更改...
    3.这题实际上可以n^2复杂度,因为n只有2000.但是本渣作死,写了nloglog的复杂度...
    n^2复杂度的话循环检查就好...
    我是用一个map<int,multiset<int> >将数字的位置记录下来...然后种种... 
    
    坑:
    if else if else这种逻辑写崩了==仍然很弱的我
    逻辑逻辑逻辑
    
    */
    
    #include<bits/stdc++.h>
    using namespace std;
    int jilu[2050],all[2050];
    map<int,multiset<int> >mp;
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",jilu+i);
            all[i]=jilu[i];
            mp[jilu[i]].insert(i);
        }
        int k=n/m;
        int w=n%m;
        map<int,multiset<int> >::iterator it;
        multiset<int>cun;
        multiset<int>que;
        for(it=mp.begin();it!=mp.end();it++){
            if(it->first <= m){
                while(it->second.size()<k){
                    if(cun.size()){
                        int ss=*cun.begin();
                        cun.erase(cun.begin());
                        jilu[ss]=it->first;
                        it->second.insert(ss);
                    }
                    else{
                        que.insert(it->first);
                        it->second.insert(0);
                    }
                }
                while(it->second.size() > k){
                    if(w>0){
                        w--;
                        it->second.erase(it->second.begin());
                    }
                    else if(que.size()){
                        int ss=*que.begin();
                        que.erase(que.begin());
                        int pos=*(it->second.begin());
                        it->second.erase(it->second.begin());
                        jilu[pos]=ss;
                    }
                    else{
                        int pos=*(it->second.begin());
                        it->second.erase(it->second.begin());
                        cun.insert(pos);
                    }
                }
            }
            else{
                while(it->second.size() > 0){
                    if(w>0){
                        w--;
                        it->second.erase(it->second.begin());
                    }
                    else if(que.size()){
                        int ss=*que.begin();
                        que.erase(que.begin());
                        int pos=*(it->second.begin());
                        it->second.erase(it->second.begin());
                        jilu[pos]=ss;
                    }
                    else{
                        int pos=*(it->second.begin());
                        it->second.erase(it->second.begin());
                        cun.insert(pos);
                    }
                }
            }
        }
        for(int i=1;i<=m;i++){
            while(mp[i].size()<k){
                int ss=*cun.begin();
                cun.erase(cun.begin());
                jilu[ss]=i;
                mp[i].insert(ss);
            }
        }
        while(que.size()){
            int pos=*cun.begin();
            int ss=*que.begin();
            cun.erase(cun.begin());
            que.erase(que.begin());
            jilu[pos]=ss;
        }
        int num=0;
        for(int i=1;i<=n;i++){
            if(jilu[i]!=all[i])num++;
        }
        printf("%d %d
    ",k,num);
        for(int i=1;i<=n;i++){
            printf("%d ",jilu[i]);
        }
    }
  • 相关阅读:
    如何安装一个高可用K3s集群?
    如何设置一个生产级别的高可用etcd集群
    从架构到部署,全面了解K3s
    这应该是最适合国内用户的K3s HA方案
    在K3s上使用Kong网关插件,开启K3s的无限可能!
    AngularJS 遗留项目的升级改造之路(一)
    Rancher首席架构师解读Fleet:它何以管理百万集群?
    资深首席架构师预测:2021年云计算的8个首要趋势
    简单4步,利用Prometheus Operator实现自定义指标监控
    当年,我的架构师之路差点完蛋,幸亏了它
  • 原文地址:https://www.cnblogs.com/tun117/p/5931805.html
Copyright © 2011-2022 走看看