八月惊魂

题目

这是一个远古时期的秘密,至今已无人关心。
这个世界的每个时代可以和一个 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;
}

相对简单。

原文地址:https://www.cnblogs.com/abcdhh/p/11182134.html