每次都选取尽可能大的即可,一个简答的贪心。所以需要记录后面的最大值,来判断当前是不是有可能的最大的那个数,从而判断值不值得弹出。
#include <bits/stdc++.h>

using namespace std;

int a[1000001];
int b[1000001];

int main() {
    int n, k, j=0, flag = true;
    stack<int> st;
    cin>>n;
    for (int i=1;i<=n;i++) {
        cin>>a[i];
    }
    for (int i=n;i>=1;i--) {
        b[i] = a[i];
        b[i] = max(b[i+1], b[i]);
    }
    for (int i=1;i<=n;i++) {
        st.push(a[i]);
        while (!st.empty()&&st.top()>=b[i+1]) {
            if (flag) {
                cout<<st.top();
                flag = false;
            } else 
            cout<<" "<<st.top();
            st.pop();
        }
    }
    while (!st.empty()) {
        cout<<" "<<st.top();
        st.pop();
    }
    return 0;
}