POJ1833-排列

http://poj.org/problem?id=1833

自己先按着书上的思路写的,结果TLE我勒个去。。。

TLE代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int main(void)
{
    int num[1024],m,n,i,j,k,un,_min,temp,t,flag;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d%d",&n,&k);
        for(i=0;i<n;i++)
           scanf("%d",&num[i]);
        flag=0;
        for(i=0;i<n-1;i++)
           if(num[i]<num[i+1])
           {
                  flag=1;
                  break;
           }
        if(flag)
        {
            for(i=1;i<=k;i++)
            {
                _min=999;
                for(j=n-1;;j--)
                {
                    if(num[j]>num[j-1])
                    {
                        un=j-1;
                        break;
                    }
                }
                for(j=un;j<n;j++)
                {
                    if(num[j]>num[un]&&num[j]<_min)
                    {
                        _min=num[j];
                        temp=j;
                    }
                }
                t=num[un];
                num[un]=num[temp];
                num[temp]=t;
                sort(num+un+1,num+n);
           }
           for(j=0;j<n;j++)
              printf("%d ",num[j]);
           printf("\n");
        }
        else
        {
            for(i=n-1;i>=0;i--)
               printf("%d ",num[i]);
            printf("\n");
        }
    }
    return 0;
}

然后度娘一下后发现了C++ STL中的next_permutation。。。。

就直接AC了,而且代码很短很精简

#include<cstdio>
#include<algorithm>
using namespace std;
int main(void)
{
    int num[1024],m,n,k,i;
    scanf("%d",&m);
    while(m--)
    {
        scanf("%d%d",&n,&k);
        for(i=0;i<n;i++)
           scanf("%d",&num[i]);
        while(k--)
           next_permutation(num,num+n);
        for(k=0;k<n;k++)
            printf("%d ",num[k]);
        printf("\n");
    }
    return 0;
}
posted @ 2012-09-11 23:42  Yogurt Shen  阅读(172)  评论(0编辑  收藏  举报