题目描述
给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
输入描述:
第一行一个数n 第二行n个数,表示入栈的顺序,用空格隔开,结尾无空格
输出描述:
输出一行n个数表示答案,用空格隔开,结尾无空格
示例1
输入
复制5 2 1 5 3 4
5 2 1 5 3 4
输出
复制5 4 3 1 2
5 4 3 1 2
说明
2入栈;1入栈;5入栈;5出栈;3入栈;4入栈;4出栈;3出栈;1出栈;2出栈
#include<bits/stdc++.h>
using namespace std;
//本题的意思是输入的数据按照输入顺序当做进栈顺序
//保证出栈的元素的字典序最大,换句话说
//其中最大的数第一个输出来,第二大第二个输出来,
//但是并不保证一定这样子输出,因为输出也是按照出栈
//的顺序来输出的。
int n;
int a[1000100];
//这里的pos数组表示的是从当前位置i到数组最后一个元素中的最大值
int pos[1000010];
stack<int>s;
int main()
{
cin>>n;
int f=0;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=n-1;i>=0;i--){
pos[i]=max(pos[i+1],a[i]);
}
for(int i=0;i<n;i++){
while(!s.empty()&&s.top()>pos[i]){
//注意当前栈顶元素在数组中始终比这个最大元素数组低一个位置
//为什么要这样子做,就是为了找到当前最大字典序的元素
//因为如果当前位置的元素比后面所有元素都大,那么它先输出可以保证字典序
//最大,因为别忘了它的输出是按照进栈出栈的顺序来的,
cout<<s.top()<<" ";
s.pop();
}
q.push(a[i]);
}
while(!s.empty()){
cout<<s.top()<<" ";
s.pop();
}
return 0;
}