题意是输出给定排列的后第k个排列。这里用的是
代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#define INF 0x7fffffff
#define mst(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int maxn=1e5+5;
int arr[1025],tmp[1025];
void output(int* arr,int num)
{
int pr=0;
for(int i=0;i<num;i++){
if(pr==0){
pr++;
printf("%d",arr[i]);
}else{
printf(" %d",arr[i]);
}
}
printf("\n");
}
int main()
{
int t;
cin>>t;
while(t--)
{
mst(arr,0);mst(tmp,0);
int n,k;
cin>>n>>k;
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
bool flag;
while(k)
{
flag=next_permutation(arr,arr+n);
if(flag=0)
{
sort(arr,arr+n);
next_permutation(arr,arr+n);
}
/*原本的想法是如果当前序列是字典序最大的序列时,后面不会再有序列,也就是说next_permutation不会再排列,所以要把序列排一下序,使它回到字典序最小的状态,重新开始;可是后来发现这个函数很智能,如果没有下一个排列的话,它会自动倒回到字典序最小的情况。也就是说,这个if其实是可以不要的*/
k-=1;
}
output(arr,n);
}
return 0;
}