欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HDU1027

程序员文章站 2022-03-22 13:33:33
...
/**HDUOJ-1027
 * Problem Description:
 *    Now our hero finds the door to the BEelzebub feng5166. He opens the door and finds feng5166 
 * is about to kill our pretty Princess. But now the BEelzebub has to beat our hero first. feng5166 says,
 * "I have three question for you, if you can work them out, I will release the Princess, or you will be
 *  my dinner, too." Ignatius says confidently, "OK, at last, I will save the Princess."
 *    "Now I will show you the first problem." feng5166 says, "Given a sequence of number 1 to N, 
 * we define that 1,2,3...N-1,N is the smallest sequence among all the sequence which can be composed 
 * with number 1 to N(each number can be and should be use only once in this problem). 
 * So it's easy to see the second smallest sequence is 1,2,3...N,N-1. Now I will give you two numbers, N and M.
 *  You should tell me the Mth smallest sequence which is composed with number 1 to N. It's easy, isn't is? Hahahahaha......"
 * Can you help Ignatius to solve this problem?
 * 
 * Input
 * The input contains several test cases. Each test case consists of two numbers, N and M(1<=N<=1000, 1<=M<=10000).
 * You may assume that there is always a sequence satisfied the BEelzebub's demand. The input is terminated by the end of file.
 * 
 * Output
 * For each test case, you only have to output the sequence satisfied the BEelzebub's demand. When output a sequence, 
 * you should print a space between two numbers, but do not output any spaces after the last number.
 *
 * Sample Input
 * 6 4
 * 11 8
 * 
 * Sample Output
 * 1 2 3 5 6 4
 * 1 2 3 4 5 6 7 9 8 11 10
 * */

#include<bits/stdc++.h>
using namespace std;
int a[1001];

int main(){
    int n, m;
    while( cin >> n >> m ){
        for( int i = 0; i < n; ++i)
            a[i] = i+1;
        int cnt = 1;
        //建议查看cppreference关于next_permutation的原型声明和用法,尤其是涉及到区间处理是端点的开闭情况
        // next_permutation(a,a+n);
        while(cnt != m ){
            ++cnt;
            next_permutation(a,a+n);
        }
        for( int i = 0; i < n-1; ++i)
            cout<<a[i]<<" ";
        cout<<a[n-1]<<endl;
    }
}

//杭电1027一道简单的题目主要是C++ next_permutation(first,last)标准库函数的使用,
//调用这个函数可以得到区间[first,last)内按照定义的compare函数确定的从小到大的全排列的
//一个组合,每调用一次,就得到恰好比上一次调用的到的排列大一点的一个新的排列,使用要求区间你的元素必须是已经排序的
//这道题目是求n个自然数(从1开始连续的n个)的第m大的全排列的组合,定义一个计数器,记录当前的排列是第几大的,如果没达到
//第m大的就调用函数生成一个新的大一点的全排列,同时使计数器自增一,连续执行此过程知道得到第m大的全排列
//最后注意题目中的输出要求,除了最后一个元素后面没有空格,其它元素后面都要输出一个空格