zoukankan      html  css  js  c++  java
  • 模板:排序(二)

    ——————————————

    插入排序

    这个厂子还是没有什么特别的,客户也都是拖延症。
    唯一需要注意的是客户与keke做了交易,要购买这个厂子的魔法代码。
    然而客户的脑袋不太灵光,所以你需要写一份让他看得懂的代码。
    提示:客户喜欢打牌。

    “这是什么鬼啊这明摆着是作者上一篇忘了讲插入排序而瞎编出来的题啊……”路由器小声嘟囔。
    “嗯?路由器你说啥了吗?”勇者问道。
    “啊……没有没有……话说你知道怎么写吗?”路由器问。
    “额……”勇者挠了挠头,“那你就说说吧。”
    “咳咳,”路由器清了清嗓子,“咱们玩把昆特(前两字删掉)牌吧。”
    经过两分钟后。
    “可恶我怎么老是赢不了你!”勇者咆哮道。
    “啊呀啊呀这不是重点……你注意到你是怎么排你的手牌了吗。”
    “啊什么……等等,我明白了!”
    然后也不必多说,这个是插入排序O(N*N)

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    using namespace std;
    int main(){
        int n,a[100];
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
        }
        for(int i=2;i<=n;i++){
            int k=a[i],j=i-1;
            while(a[j]<k&&j!=0){
                a[j+1]=a[j];
                j--;
            }
            a[j+1]=k;
        }
        for(int i=1;i<=n;i++){
            printf("%d ",a[i]);
        }
        return 0;
    }

    //也蛮好懂得我就不多说了。

    ——————————————

    桶排序

    这个厂子主要给南和北两个国家准备的,由于双方大战一出即发,他们的钢材要求准备的特别快,但是因为需求量多,所以这个场子的容量也特别的大。
    由于南与北对着干,所以南要正的钢材,北就要负的钢材(咦还有负的钢材吗?)。

    “啊……这把就头疼了,双方都需要快……冒泡魔法看样子是不行了”勇者沮丧到。
    “但是没事啊,这里地方大么……不如我们多拿一些桶来吧,有奇用!”路由器神秘地说。
    于是路由器拿了很多的桶,分别标号为-100~100,然后将如下的钢材放在桶里面“2 3 5 4 6 1 -1”,每个钢材放在跟他们对应的桶里面
    “现在,按编号从大到小打开每一个桶,将里面的钢材拿出来!”
    勇者知道最大的钢材为6,于是从6的桶里面找,拿出了6,又打开了5,拿出了5……到1桶的时候什么也没有,跳过……到-1的桶,拿出-1,此时勇者知道-1是最小的了,于是他就不用再打开剩下的桶了。
    “哦!!!!我明白了我明白了!”勇者当场写下了如下的魔法。经过路由器认定,是桶排序。复杂度是O(N)//另外说一下,路由器自我认为觉得应该是O(MAXN-MINN)……为什么这样写呢,一会就知道了。

    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<iostream>
    using namespace std;
    const int INF=99999999;
    int zheng[10000000]={0},fu[10000000]={0};
    int main(){
        int n,a[100],maxn=-INF,minn=INF;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(maxn<a[i])maxn=a[i];
            if(minn>a[i])minn=a[i];
            if(a[i]>=0)zheng[a[i]]++;
            else fu[-a[i]]++;
        }
        for(int i= maxn;i>= minn;i--){
            int j=i;
            if(j<0){
                j=abs(j);
                while(fu[j]!=0){
                    fu[j]--;
                    printf("%d ",i);
                }
            }
            else{
                while(zheng[j]!=0){
                    zheng[j]--;
                    printf("%d ",i);
                }
            }
        }
        return 0;
    }

    “可是……”勇者拿过了一个订单,“这个订单手排都比你的排序魔法强啊。”上面就写了两个数。
    “-10000000 10000000”。
    “我晕……”路由器无奈,“那么这就是桶排的一个不足之处,事实上还可以优化,就假设十个桶吧,我们可以在桶里放多个钢材,但这些钢材长度要符合桶上面的范围,然后对每一个桶进行排序,在那之后还是从大到小开桶拿出来就可以了。但是…………写这个干啥呢?任务已经可以过了,就不要浪费脑细胞想这个了,走吧!”

    ——————————————————————
    于是勇者真的有那个脑子能成功吗?请看下篇。

  • 相关阅读:
    Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
    Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】
    Codeforces 859E Desk Disorder:并查集【两个属性二选一】
    Codeforces 869C The Intriguing Obsession:组合数 or dp
    Codeforces 888D Almost Identity Permutations:错排公式
    Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】
    Codeforces 895C Square Subsets:状压dp【组合数结论】
    leetcode
    hdu6578 2019湖南省赛D题Modulo Nine 经典dp
    Codechef March Cook-Off 2018. Maximum Tree Path
  • 原文地址:https://www.cnblogs.com/luyouqi233/p/7706043.html
Copyright © 2011-2022 走看看