njupt 字典序最大的出棧序列

來源:互聯網
上載者:User

題意:給出入棧序列{A},保證{A}各個元素值各不相等,輸出字典序最大的出棧序列.

如入棧序列{A} = 1, 2, 9, 4, 6, 5

則字典序最大的出棧序列為9, 6, 5, 4, 2 1

/*    棧的性質就是先進後出,所以對於依次入棧的兩個元素a,b,有兩種情況:        <1>先壓a進棧,不彈出,再壓b進棧,則最終的出棧序列a一定位於b之後。        <2>要想a位於b之前,則只能在b進棧之前把a彈出。    所以求字典序最大的出棧序列,就可以根據這一性質來搞。。設rmax[i] 為區間[i, n]中最大元素,而max_pos則記錄該元素的位置。    <1>初始l=1    <2>若棧為空白,則直接壓入當前元素       若棧頂元素S.top() 比區間[l, n]的最大元素rmax[l]值小,則應該把當前元素到max_pos[l]的這段全都壓入棧(即區間[i, max_pos[l]]),然後pop出此時的棧頂元素,其實也就是rmax[l].  接著新的l = max_pos[l] + 1.       若S.top() > rmax[l],則棧頂元素出棧,l不變。    <3>重複<2>*/#include <stdio.h>#include<iostream>#include<stack>using namespace std;const int N = 128;stack<int> stk;int n, a[N], rmax[N], max_pos[N];int main() {    scanf("%d", &n);    for(int i = 0; i < n; ++i) scanf("%d", a+i);    for(int i = n-1; i >= 0; --i)        if(rmax[i+1] > a[i]) rmax[i] = rmax[i+1], max_pos[i] = max_pos[i+1];        else  rmax[i] = a[i], max_pos[i] = i;    for(int j = 0, i = 0; i < n; ++i) {        if(stk.empty() || stk.top()<rmax[j])            for(int k = max_pos[j]; j <= k; ++j) stk.push(a[j]);        printf("%d%c", stk.top(), i<n-1?' ':'\n'), stk.pop();    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.