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;
    }
  • 相关阅读:
    C++ 遍历文件
    C++ struct
    C++动态数组
    C++ 常量指针和矩阵
    imfilter与fspecial
    空间域图像增强:卷积和空间域滤波
    数字图像处理-图像的几何变换(一)
    多线程中的生产者消费者问题
    使用Netty进行Android与Server端通信实现文字发送接收与图片上传
    C# FileSystemWatcher 监视磁盘文件变更
  • 原文地址:https://www.cnblogs.com/cax1165/p/6070908.html
Copyright © 2011-2022 走看看