vijosP1115 火星人

时间:2021-02-13 05:25:32

vijosP1115 火星人

链接:https://vijos.org/p/1115

【思路】

排列组合。

题目要求为求第下m个排列。

这里有两种方法,首选的是调用algorithm中的next_permutation函数,其次就是手写生成函数。

【代码1】53ms

 #include<iostream>
#include<algorithm>
using namespace std;
const int maxn = +;
int p[maxn];
int n,m; int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<n;i++) cin>>p[i]; while(m--) next_permutation(p,p+n); for(int i=;i<n;i++) cout<<p[i]<<" "; return ;
}

【代码2】106ms

 #include<iostream>
#include<algorithm>
using namespace std;
const int maxn = +;
int p[maxn];
int n,m; bool get_permutation() {
int i=n-;
while(i> && p[i-] >= p[i]) i--;
if(i==) return false;
int mp=i;
for(int j=i+;j<n;j++) {
if(p[j]<=p[i-]) continue;
if(p[j]<p[mp]) mp=j;
}
swap(p[mp],p[i-]);
sort(p+i,p+n);
return true;
} int main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=;i<n;i++) cin>>p[i]; while(m--) get_permutation(); for(int i=;i<n;i++) cout<<p[i]<<" "; return ;
}