3.2station
题意火车进入,然后要求以最大字典序输出
解题思路:先用一个数组储存当前位置之后最大的数字是什么,然后把已经进站的最后一节火车和还没进站的车的最大值,哪个更大,如果已经进站的更大,那么就先出站,否则就先一直把那些火车进站直到那个最大的火车,然后输出就好了。
#include<iostream>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
#define sf scanf
#define scf(x) scanf("%d",&x)
#define scff(a,b) scanf("%d%d",&a,&b)
#define pf printf
#define prf(x) printf("%d\n",x)
#define mm(a,b) memset((a),(b),sizeof(a))
#define rep(i,a,b) for(int i=(a);i<(b);i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int N=1e5+7;
int a[N],c[N];
stack<int>v;
int main()
{
mm(a,0);
int n,x,maxn=0;scf(n);
rep(i,1,n+1)
{
scf(x);
c[i]=a[i]=x;
}
per(i,n-1,1)//记录最大的数是多少
a[i]=max(a[i+1],a[i]);
int pos=1; //pos是已经进入的车辆数
pf("%d",a[1]);
for(;pos<=n;pos++)
{
if(c[pos]==a[1])
{
pos++;
break;
}else
v.push(c[pos]);
}
while(1)
{
if(pos>n&&v.empty()) break;//都走完且栈为空退出
if(pos>n)//都走完就只输出
{
pf(" %d",v.top());
v.pop();
}
else if(v.empty())//栈为空就判断当前这个是不是最大的,是就输出,不是就存入
{
if(a[pos]==c[pos])
pf(" %d",a[pos]);
else
v.push(c[pos]);
pos++;
}else
{
if(v.top()>a[pos])//如果已经进的更大就输出这辆
{
pf(" %d",v.top());
v.pop();
}else//否则
{
if(a[pos]==c[pos])//如果当前这个就是最大的就输出
pf(" %d",a[pos]);
else //否则进站
v.push(c[pos]);
pos++;
}
}
}
pf("\n");
return 0;
}