poj1833

来源:互联网 发布:淘宝店开了一年没生意 编辑:程序博客网 时间:2024/06/09 16:18

题目大意:有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>

0 0
原创粉丝点击