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;
    }
  • 相关阅读:
    从读者角度来看Blog
    NDuiker项目第3天
    IssueVision的List控件源码分析
    测试一个网站的想法
    IssueVision的PaneCaption控件源码分析
    技术研究的时候不要忘了“集成创新”
    人脸识别活体检测之张张嘴和眨眨眼
    jsp>Session 小强斋
    jsp>Request对象 小强斋
    jsp>四种作用域 小强斋
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070908.html
Copyright © 2011-2022 走看看