题目:

火星人

题目解析

先看通过记录

image

image

这里,我们先介绍一个函数next_permutation

next_permutation是一个原地算法(会直接改变这个集合,而不是返回一个集合),它对一个可以遍历的集合(如string,如vector),将迭代器范围 [first, last] 的排列 排列到下一个排列(第一个是名词,第二个是动词,第三个是名词),其中所有排列的集合默认按照operator < 或者 字典序 或者 按照输入到第三个参数 comp 的排列方法排列。如果存在这样的“下一个排列”,返回true并执行排列,否则返回false

本题我们看

image

下面的代表数字都不用管它

我们看上面

123 -> 132 -> 213 -> 231 ->312 -> 321

这不就是全排列吗?!

所以我们甭管什么,直接使用next_permutation排序mm次就OK了

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
	int n, m, x;
	cin >> n >> m;
	vector<int> vec;
	for(int i = 1; i <= n; i++){
		cin >> x;
		vec.push_back(x);
	}
	while(m--){
		next_permutation(vec.begin(), vec.end());
	}
	for(auto p : vec){
		cout << p << ' ';
	}
	return 0;
}