Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 16483 | Accepted: 6607 |
Description
大家知道,給出正整數n,則1到n這n個數可以構成n!種排列,把這些排列按照從小到大的順序(字典順序)列出,如n=3時,列出1 2 3,1 3 2,2 1 3,2 3 1,3 1 2,3 2 1六個排列。
任務描述:
給出某個排列,求出這個排列的下k個排列,如果遇到最後一個排列,則下1排列爲第1個排列,即排列1 2 3…n。
比如:n = 3,k=2 給出排列2 3 1,則它的下1個排列爲3 1 2,下2個排列爲3 2 1,因此答案爲3 2 1。
Input
Output
Sample Input
3 3 1 2 3 1 3 1 3 2 1 10 2 1 2 3 4 5 6 7 8 9 10
Sample Output
3 1 2 1 2 3 1 2 3 4 5 6 7 9 8 10
/*************************************************************************************/
題目分析:這個題手寫代碼的話比較繁瑣,需要很多判斷,寫了一個較繁瑣,546Ms,不過可以巧妙地利用STL,469Ms效率還可以。
利用next_permutation巧妙地解決
如下代碼:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 2048
using namespace std;
int f[MAXN];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&f[i]);
while(k--)
next_permutation(f+1,f+n+1);
for(int i=1;i<n;i++)
printf("%d ",f[i]);
printf("%d\n",f[n]);
}
//while(1);
return 0;
}