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;
}
posted @ 2018-12-08 10:05  一无所知小白龙  阅读(136)  评论(0编辑  收藏  举报