HDU1027

/**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大的全排列
//最後注意題目中的輸出要求,除了最後一個元素後面沒有空格,其它元素後面都要輸出一個空格

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章