当前位置 博文首页 > 逐梦er的博客:牛客练习赛 栈和排序

    逐梦er的博客:牛客练习赛 栈和排序

    作者:[db:作者] 时间:2021-09-21 18:14

    题目描述

    给你一个1->n的排列和一个栈,入栈顺序给定
    你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
    当无法完全排序时,请输出字典序最大的出栈序列

    输入描述:

    第一行一个数n
    第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格

    输出描述:

    输出一行n个数表示答案,用空格隔开,结尾无空格
    示例1

    输入

    5
    2 1 5 3 4

    输出

    5 4 3 1 2

    说明

    2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈

    备注:

    对于100%的数据,有1<=n<=1000000,保证给的是一个排列

    思路:将n个数都放入数列中,如果在数列中第i个数为[i,n]区间内的最大值就直接输出,反之将它放入数组

    #include<stdio.h>
    #include<math.h>
    #include<string.h>
    int a[1000010],b[1000010],c[1000010];
    void fff(n)
    {
        c[n-1]=a[n-1];
        for(int i=n-2;i>=0;i--)//求第【i,n】区间的最大值
            c[i]=max(c[i+1],a[i]);
    }
    int max(int a,int b)   
    {
        if(a>b)return a;
        else return b;
    }
    int main()
    {
        int n,t=0,k=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        fff(n);
        for(int i=0;i<n;i++){
            if(c[i]==a[i]){       //是最大值就直接输出
                if(k==0)printf("%d",c[i]);
                else printf(" %d",c[i]);
                k++;
            }
            else b[t++]=a[i];//否则存入另一个数组
        }
        for(int i=t-1;i>=0;i--)  //倒序输出
        {
            if(k==0)printf("%d",b[i]);
            else printf(" %d",b[i]);
            k++;
        }
        printf("\n");
        return 0;
    }
    
    cs
    下一篇:没有了