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大的全排列
//最后注意题目中的输出要求,除了最后一个元素后面没有空格,其它元素后面都要输出一个空格
上一篇: c++贪吃蛇代码是什么