题目大意:
给你一个1->n的排列和一个栈,入栈顺序给定
你要在不打乱入栈顺序的情况下,对数组进行从大到小排序
当无法完全排序时,请输出字典序最大的出栈序列
因为要按照字典序输出,直接做一遍循环,从1开始直接把从当前位置到n的之间的最大的数字之间的数字全部压栈,然后弹掉栈顶最大的数组,如此往复,直至最后再将栈里的元素全部弹出就好了。
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <stack>
#include <string.h>
using namespace std;
const int N=1000005;
stack<int >sta;
int num[N];
int maxx[N];
int pos[N];
int ans[N];
int main()
{
int n;
while(cin>>n)
{
memset(maxx,0,sizeof(maxx));
memset(pos,0,sizeof(pos));
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
}
maxx[n]=num[n];
pos[n]=n;
for(int i=n-1;i>=1;i--)
{
if(num[i]>maxx[i+1])
{
pos[i]=i;
maxx[i]=num[i];
}
else
{
pos[i]=pos[i+1];
maxx[i]=maxx[i+1];
}
}
/*
for(int i=1;i<=n;i++)
printf("maxx=%d pos=%d\n",maxx[i],pos[i]);
*/
while(!sta.empty())
sta.pop();
int k=1;
int tot=0;
while(k<=n)
{
for(int i=k;i<=pos[k];i++)
sta.push(num[i]);
ans[++tot]=sta.top();
sta.pop();
k=pos[k]+1;
}
while(!sta.empty())
{
ans[++tot]=sta.top();
sta.pop();
}
for(int i=1;i<n;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}