主要用到了栈.
规定每节车厢只能进出栈一次.所以可以对于每一节目标车厢tar[i],用j表示当前要入栈的车厢.
如果tar[i]>=j 表示tar[i]只能从未入栈的车厢中找,直到找到直接拿走,中间的那些车厢全部入栈,
如果tar[i]<j,表示tar[i]只能从栈中找,很明显必须是栈顶那节车厢,如果不是的话那么这栈顶的这节车厢就相当于被抛弃掉了,就达不到目标了.
#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 1005;
int target[maxn], stak[maxn], n;
int main(){
while(~scanf("%d", &n) && n){
while(1){
int i = 1, j = 1, top = 0, f = 1;
scanf("%d", &target[i]);
if(!target[i++])break;
for(; i <= n; ++i){
scanf("%d", &target[i]);
}
for(i = 1; i <= n; ++i){
if(target[i] >= j){
int found = 0;
while(j <= n){
if(j++ == target[i]){
found = 1;
break;
}
stak[top++] = j - 1;
}
if(!found){
f = 0;
break;
}
}else{
top--;
if(top < 0 || stak[top] != target[i]){
f = 0;
break;
}
}
}
if(f){
printf("Yes\n");
}else{
printf("No\n");
}
}
printf("\n");
}
return 0;
}