每次都选取尽可能大的即可,一个简答的贪心。所以需要记录后面的最大值,来判断当前是不是有可能的最大的那个数,从而判断值不值得弹出。
#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; }