#include<cstdio> #include<stack> #include<cstring> using namespace std; int n, jxt[1100] = {0}; int main() { int ll = 0; while(scanf("%d", &n) != EOF && n) { while(scanf("%d", &jxt[1]) != EOF && jxt[1]) { for(int i = 2; i <= n; i++) scanf("%d", &jxt[i]); stack<int> s; int a = 1, b = 1; int flag = 1; while(b <= n) { if(a == jxt[b]) {a++; b++;}//正好符合一进一出时的情境。 else if(!s.empty() && s.top() == jxt[b]) {s.pop(); b++;}//一串的 else if(a <= n) s.push(a++); else {flag = 0; break;} } if(flag) printf("Yes "); else printf("No "); memset(jxt, 0, sizeof(jxt)); } printf(" "); } }
这个题吧。。。感觉a,b很重要。
可以把b,看作是成题目所给的那些火车序列里实现的火车数目, 当为n时, 即表示成功。
a可以看做成已过的火车,当其数目大于n时, 及失败。
把握好这两点即可。
可实现的火车无非两种情况一个,,一串的, 一个单个进的。。。