码迷,mamicode.com
首页 > 其他好文 > 详细

poj 1833 排列

时间:2016-07-31 20:45:21      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:

根据一个序列,求下一个序列。如果一串数字是降序排列,则一定是组合成的最大的数字,只要这串数字中有地方是升序的,则不是组合成的最大数字。
比如:num[6] = 123654
从后向前,如果num[i] < num[i+1],则停止循环,在这里是3<6,则从num[i+1]后边的数字(5和4)里面找到一个数n,n满足条件n>3(num[i])&&n<6(num[i+1]),而且这个n是找到的满足条件里面的最小的(如果找不到这个n,则交换num[i]和num[i+1]),这时交换n和3(num[i]),则序列变成124563,然后把(num[i])4后边的数字从小到大排序,得到124356,就找到了下一个序列

第一遍用的cin和cout,超时了,后来换成scanf和printf就ac了,还是c的速度快

#include <cstdio>
#include <algorithm>
using namespace std;
int n,k;
int num[1025];

void process()
{
    int i,j;
    for(i = n-2; i >= 0; --i)
        if(num[i] < num[i+1])
            break;
    if(i == -1)
    {
        sort(num,num+n);
        return ;
    }
    int t = i+1;
    //如果从(t,n)找不到符合的,那么t就和i替换,所以从后向前循环比较好,因为t后边是降序排列的
    for(j = n-1; j >= i+2; --j)
        if(num[j] > num[i] && num[j] < num[t])
            break;

    int temp = num[j];
    num[j] = num[i];
    num[i] = temp;

    sort(num+t,num+n);

    return ;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&n,&k);
        for(int i = 0; i < n; ++i)
            scanf("%d",&num[i]);
        for(int i = 0; i < k; ++i)
            process();
        for(int i = 0; i < n; ++i)
            printf("%d ",num[i]);
        printf("\n");
    }
    return 0;
}

 

poj 1833 排列

标签:

原文地址:http://www.cnblogs.com/guoyongheng/p/5723702.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!