Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 19063 | Accepted: 7429 |
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
#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
int t;
int n,k,a[1050];
int i;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
while(k--)
next_permutation(a,a+n);
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int cmp(const void *a,const void *b)
{
return(*(int *)a-*(int *)b);
}
void f(int a[],int n)
{
int i;
if(n==1)
return;
for(i=n-1;i>0;i--)
{ ///從後往前找開始降序的第一個數
if(a[i]>a[i-1])
break;
}
if(i==0)
{ ///如果當前序列爲最大值,則下一個爲最小值
qsort(a,n,sizeof(a[0]),cmp);
return;
}
int min=100000;
int k,flag,temp;
for(k=i;k<n;k++)
{ ///從開始降序的後邊那個數開始找,找大於a[i-1]的最小的數a[flag]
if(a[k]>a[i-1])
{
if(a[k]<min)
{
flag=k;
min=a[k];
}
}
}
temp=a[i-1]; ///交換
a[i-1]=a[flag];
a[flag]=temp;
qsort(a+i,n-i,sizeof(a[0]),cmp);///將a[i]到a[n-1]排序
}
int main()
{
int t,n,i,k;
int a[1050];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
while(k--)
{
f(a,n);
}
for(i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[n-1]);
}
}