VJ链接(紫书P140)
题目大意:右边铁轨进入火车,从左边铁轨出。出去的方式有两种,一是直接从右边铁轨出去,另一种是先进入中转站,然后从中转站按照先进后出的顺序出去。
也就是说,从右边出去了就不能回来,去中转站也不能再回去,是一个单向的过程。
比如有五节车厢,(1 2 3 4 5),(1 2 5 4 3),(5 4 3 2 1)都是可以实现的。
比如1 2 5 4 3
1直接出去,2直接出去,3 4 5先进入中转站,然后从中转站先进后出,按照5 4 3的顺序出去。
还要注意输入输出的格式。
思路
每次单个输入要判断的序列的元素,a与车厢直接出去的顺序进行比较,即a与cnt比较,如果相等,从stack里弹出该元素。如果不相等,就继续向stack里push剩下的cnt。
以1 2 5 4 3举例
- a=1,ans={1},相等,弹出,ans为空
- a=2,ans={2},相等,弹出,ans为空
- a=5,ans={3},不相等,继续push,ans={3,4,5} 此时,a=ans.top(),即为5,弹出5。
- a=4,ans.top() = 4,弹出4
- a=3,ans.top() = 3,弹出3
- 输出Yes
注意
- 最关键的一点,因为每次判断的都是单个输入的元素,如果输入序列中的某一个判断为no,那么还要继续输入剩下的元素才行!
所以在no的if语句下,要加入一个继续输入元素的语句。 - 在输入每组序列之前,如果stack没有清干净,需要手动清一下元素
#include<iostream>
#include<stack>
using namespace std;
const int maxn=1005;
stack<int> ans;
int main()
{
int n;
while(cin>>n && n!=0){
int a;
while(cin>>a && a!=0){
int cnt = 1,flag=1;
while(!ans.empty())ans.pop();
for(int i=1;i<n;i++){
while(cnt<=n && (ans.empty()||ans.top()!=a)){
ans.push(cnt++);
}
if(ans.top()!=a){
cout<<"No"<<endl;
while(getchar()!='\n');
break;
}
ans.pop();
cin>>a;
flag++;
}
if(flag==n)cout<<"Yes"<<endl;
}
cout<<endl;
}
}