zoukankan      html  css  js  c++  java
  • 后缀最大值

    问题描述:
    栈是一种强大的数据结构,它的一种特殊功能是对数组进行排序。例如,借助一个栈,依次将数组 1,3,2 按顺序入栈或出栈,可对其从大到小排序:
    1 入栈;3 入栈;3 出栈;2 入栈;2 出栈;1 出栈。
    在上面这个例子中,出栈序列是 3,2,1,因此实现了对数组的排序。
    遗憾的是,有些时候,仅仅借助一个栈,不能实现对数组的完全排序。例如给定数组 2,1,3,借助一个栈,能获得的字典序最大的出栈序列是 3,1,2:
    2 入栈;1 入栈;3 入栈;3 出栈;1 出栈;2 出栈。
    请你借助一个栈,对一个给定的数组按照出栈顺序进行从大到小排序。当无法完全排序时,请输出字典序最大的出栈序列。
    输入格式:
    输入共2行。
    第一行包含一个整数�,表示入栈序列长度。
    第二行包含�个整数,表示入栈序列。输入数据保证给定的序列是1到 n 的全排列,即不会出现重复数字。
    输出格式:
    仅一行,共�个整数,表示你计算出的出栈序列。
    样例输入:
    3
    2 1 3
    样例输出:
    3 1 2

    #include<iostream>
    #include<cstdio>
    #include<stack>
    using namespace std;
    const int maxn=1000010;
    int n,a[maxn],s[maxn];
    stack<int> st;
    int main()
    {
        freopen("haha.in","r",stdin);
        freopen("haha.out","w",stdout);
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
        for(int i=n;i>=1;i--)
        s[i]=max(s[i+1],a[i]);
        for(int i=1;i<=n;i++)
        {
            st.push(a[i]);
            while(!st.empty()&&st.top()>=s[i+1])
            {
                printf("%d ",st.top());
                st.pop();
            }
        }
        while(!st.empty())
        {
            printf("%d ",st.top());
            st.pop();
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }
  • 相关阅读:
    Flesch Reading Ease(模拟)
    实验一:词法分析设计
    java—容器学习笔记
    [转载]马士兵Java视频教程 —— 学习顺序
    Java的安装过程
    编程之美初赛第一场
    RCC 2014 Warmup (Div. 2)
    ural 1017. Staircases(dp)
    ural 1012. K-based Numbers. Version 2(大数dp)
    ural 1009. K-based Numbers(简单dp)
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070908.html
Copyright © 2011-2022 走看看