题意:
给你一个排列,要你求这个排列下的第K个排列,如果遇到最后一个排列,则下1个排列为第一个排列
思路:
c++的STL中提供了一个库函数next_permutation求下一个排列,当求出的排列为最后一个排列时,返回值为0,注意提交的时候用C++,不然会TLE
代码如下
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
using namespace std;
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n,sum;
int a[1111];
scanf("%d %d",&n,&sum);
for(int i=1; i<= n; i++)
scanf("%d",&a[i]);
int flag=0;
while(flag< sum)
{
while(next_permutation(a+1,a+n+1))
{
flag++;
if(flag==sum)
{
printf("%d",a[1]);
for(int i=2; i<= n; i++)
printf(" %d",a[i]);
printf("\n");
break;
}
}
for(int i=1; i<= n; i++)
a[i]= i;
flag++;
if(flag==sum)
{
printf("%d",a[1]);
for(int i=2; i<= n; i++)
printf(" %d",a[i]);
printf("\n");
break;
}
}
/*我之前不知道next_permutation执行到最后一个排列时候,再往下执行时会自动循环到第一个排列
所有我在 ext_permutation执行到最后一个排列,做了特判,让排列跳到第一个排列去
后面月神告诉我了,我才知道这里其实不必要写这么长
只需要
int flag=0;
while(flag< sum)
{
flag++;
next_permutation(a+1,a+n+1);
}
printf("%d",a[1]);
for(int i=2; i<= n; i++)
printf(" %d",a[i]);
printf("\n");
*/
}
return 0;
}
next_permutation的用法:
作用是求当前排列的下一个排列
这个函数的用法就和sort一样,注意执行到最后一个排列时,函数返回值为0