• 八月惊魂


    题目

    这是一个远古时期的秘密,至今已无人关心。
    这个世界的每个时代可以和一个 1 ∼ n 的排列一一对应。
    时代越早,所对应的排列字典序就越小。
    我们知道,公爵已经是 m 个时代前的人物了。
    并且通过翻阅古籍,我们得知了公爵所在时代所对应的排列。
    那么我们的时代所对应的排列是什么?
    希望以此能寻回我们失落的文明……
    Input
    第一行一个正整数 n。第二行一个正整数 m。
    第三行 n 个整数,表示公爵所在时代对应的排列。
    Output
    一行 n 个整数,表示我们所在的时代对应的排列。
    Examples
    august.in august.out
    5
    3
    1 2 3 4 5
    1 2 4 5 3
    Notes
    对于所有数据,满足 n ≤ 10000 , m ≤ 100。
    Task1[30%]
    n ≤ 10
    Task2[60%]
    n ≤ 50
    Task3[100%]
    无特殊限制


    思路

    题意转化:对于n个数的数列,进行排列,求第m个大于此数列的数列。

    查找后2个是否逆序,若是,将后3个递归。如此运算,找后面大于此数中最小数交换,然后将后面数列顺序排列。


    代码

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,a[100001],head;
    void sort1(int);
    bool cmp(int,int);
    bool ni(int);
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)
        cin>>a[i];
        a[0]=0x3f3f3f3f;
        for(int i=1;i<=m;i++)
        {
            head=0;
            sort1(2);
                for(int i=1;i<=n;i++)
        cout<<a[i]<<" ";
        cout<<endl;
        }
        return 0;
    }
    void sort1(int x)
    {
        if(ni(x))
        sort1(x+1);
        else
        {
            if(x==2)
            swap(a[n-1],a[n]);
            else
            {
                for(int i=n-x+2;i<=n;i++)
                {
                    if(a[i]<a[head]&&a[i]>a[n-x+1])
                    {
                        head=i;
                    }
                }
                swap(a[n-x+1],a[head]);
                sort(a+n-x+2,a+n+1,cmp);
            }    
        }
    }
    bool ni(int x)
    {
        for(int i=n-x+1;i<n;i++)
        {
            if(a[i]<a[i+1])
            return false;
        }
        return true;
    }
    bool cmp(int x,int y)
    {
        return x<y;
    }

    相对简单。

  • 相关阅读:
    Java-数据结构与算法-选择排序与冒泡排序
    Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList
    Java-马士兵设计模式学习笔记-装饰者模式
    1072 Gas Station (30)(30 分)
    1034 Head of a Gang (30)(30 分)
    poj 3723 Conscription
    qduoj 218 签到题
    1045 Favorite Color Stripe (30)(30 分)
    1068 Find More Coins (30)(30 分)
    1057 Stack (30)(30 分)
  • 原文地址:https://www.cnblogs.com/abcdhh/p/11182134.html
Copyright © 2020-2023  润新知