作为一名c++新手,看到一道水题,随手写篇博客
1.题目
//火车调度
//时间限制 : 10000 MS 空间限制 : 65536 KB
//评测说明 : 1s
//问题描述
//某城市有一个火车站,如下图 所示,现有 n(n < =10000)节火车车厢,顺序编号为 1,2,3,...,n,按编
//号连续依次从 A 方向的铁轨驶入车站,从 B 方向铁轨驶出。一旦车厢进入车站就不能再回到 A 方向的铁轨
//上;在车站的门口有工人可以将车厢拖出车站,工人一次只能拖一节车厢,并且只能将车厢拖入B方向的铁
//轨。一旦车厢出了车站就不能再回到车站。车站一开始为空,最多能停放 10000 节车厢。
//为了方便装货,调度员需要将车厢从新排列,问能否将车厢编号排列成A1,A2,......,An。也就是使车厢从B
//方向驶出的编号是A1,A2,......,An。如果能输出"yes",否则输出"no"。
//输入格式
//第一行,一个整数n
//第二行,n个用空格间隔的整数,表示出站时车厢编号要排列成的顺序A1,A2,......,An
//输出格式
//一行,一个单词"yes"或者"no"
//样例输入
//样例输入1:
//5
//3 2 5 4 1
//样例输入2:
//5
//3 1 5 4 2
//样例输出
//样例输出1:
//yes
//样例输出2:
//no
这题主要是考对栈的合理运用;
//我就不写用数组模拟了;
AC代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
int n,t[maxn];
int main()
{
cin>>n;
stack<int> s;
int a=1,b=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
}
int k=1;
while(b<=n)
{
if(a==t[b])
{
a++;
b++;
}
else if(!s.empty()&&s.top()==t[b])
{
s.pop();
b++;
}
else if(a<=n)
{
s.push(a++);
}
else
{
k=0;
break;
}
}
printf("%s\n",k?"yes":"no");
return 0;
}