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

京公网安备 11010502036488号