输入
分块,每块第一行:列车数;接下来:列车顺序;最后一行:0
结束标志:该块只有0
输出
分块输出,块之间用空格隔开
分析
此类题可以用栈的方式来解决,共分为以下几种情况:
- (1)A->B,此时进入的列车序号正好等于要求的列车序号中的当前序号,直接出去
- (2)Station->B,此时Station最上面的列车序号等于要求的列车序号中的当前序号,从Station出去(出栈)
- (3)A->Station,此时进入的列车序号不等于要求的列车序号中的当前序号,需要进入Station等待(进栈)
- (4)如果不符合上述三种情况,则说明无解
代码
#include <cstdio>
#include <stack>
using namespace std;
int main(){
int n,t,j;
int A,B;//A表示当前车厢序号(从1开始递增),B表示对应目标在target中的下标
int ok;
int target[1010];//存放目标序列
while(scanf("%d",&n)==1){//一个块
stack<int> s;
if(n==0){//结束标志
break;
}
else{
while(1){
ok=1;
A=B=1;
scanf("%d",&t);//查看第一个数是否为0
if(t==0){
printf("\n");
break;
}
else{
target[0]=t;
for(j=1;j<n;j++)
scanf("%d",&target[j]);
while(B<=n){
if(A==target[B-1]){//情况1
A++;
B++;
}
else if(!s.empty()&&s.top()==target[B-1]){//情况2
s.pop();
B++;
}
else if(A<=n){//情况3
s.push(A++);
}
else{
ok=0;
break;
}
}
printf("%s\n",ok?"Yes":"No");
}
}
}
}
return 0;
}