NOJ 1429 全排列的输出

来源:互联网 发布:mac chm阅读器 最好的 编辑:程序博客网 时间:2024/06/07 22:09


全排列的输出

                     时间限制(普通/Java) :1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
                                                      总提交 : 107            测试通过 : 32 


题目描述

全排列就是n个不同元素排成一列,我们不妨可以简单地将n个元素理解为自然数1,2,…,n。现假设不同的全排列按照字典序自动从小到大排,123…n的序号为零。编程读入n、m,输出序号为m(m<=n!-1)的全排列。例如n=5,m=2,则输出为:

1 2 4 3 5



输入

一行两个自然数n、m(1<n<20,0<=m<=n!-1)。

输出

序号为m的全排列,每个元素后有一个空格。

样例输入

3 5

样例输出

3 2 1 


题目来源

JSOI2010


题目链接:http://acm.njupt.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1429


题目分析:生成第m个排列数,再练一次排列数板子


#include <cstdio>#include <algorithm>using namespace std;int a[21], n, cnt;bool get(){    int t1 = -1, t2;    for(int i = n - 1; i > 0; i--)    {        if(a[i - 1] < a[i])        {            t1 = i;            break;        }    }    if(t1 == -1)        return false;    t2 = t1;    for(int i = t1 + 1; i < n; i++)    {        if(a[i] <= a[t1 - 1])            continue;        t2 = i;    }    swap(a[t1 - 1], a[t2]);    sort(a + t1, a + n);    cnt++;    return true;}int main(){    int m;    scanf("%d %d", &n, &m);    cnt = 1;    for(int i = 0; i < n; i++)        a[i] = i + 1;    while(cnt <= m)        get();    for(int i = 0; i < n; i++)        printf("%d ", a[i]);    printf("\n");}


0 0