题目大意:有T组测试数据,每组测试数据输入n,k,以及从1到n的一个排列,表示有n个数,k为此排列按照字典顺序后第k个排列,输出这个排列。
解题思路:
1.从最后往前找,直到找到第一个升序排列,即啊a[i]>a[i-1];
2.从a[i]开始向后找,找到比a[i]大的最小的元素a[p];
3.交换a[i-1]与a[p];
4.将a[i]及以后的数降序排列;
5.输出。
个人心得:
这个题虽然不难,但是解这个题还是费了姐姐我n多个脑细胞,还好最终解了出来。在这其中错了好多次,个人对其中的细节部分掌握的不是很好!不过在以后的日子中肯定会努力的!耶,加油↖(^ω^)↗
个人觉得一定要懂得原理,所以用模板的部分被注释掉了,自己感觉收获了,也希望能帮助到大家!
代码:
<span style="font-size:18px;"><strong>#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
//int main()
//{
// int t,n,k,i,index,temp,a[1025];
// 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);
// printf("%d",a[0]);
// for(i=1;i<n;i++)
// printf(" %d",a[i]);
// printf("\n");
// }
// return 0;
//}
int main()
{
int t,n,k,i,index,temp,a[1025];
scanf("%d",&t);
while(t--)
{
a[0]=1024;
index=temp=0;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
while(k--)
{
for(i=n;i>1;i--)
{
if(a[i]>a[i-1])
{
index=i-1;
break;
}
}
if(index)
{
for(i=index+1;i<=n;i++)
{
if(a[i]>a[index]&&a[i]<a[temp])
{
temp=i;
}
}
int m=a[index];
a[index]=a[temp];
a[temp]=m;
}
sort(a+index+1,a+n+1);
}
printf("%d",a[1]);
for(i=2;i<=n;i++)
printf(" %d",a[i]);
printf("\n");
}
return 0;
}
</strong></span>