Rails
Time Limit: 1000 MS Memory Limit: 10000 KB
64-bit integer IO format: %I64d , %I64u Java class name: Main
Description

The local tradition is that every train arriving from the direction A continues in the direction B with coaches reorganized in some way. Assume that the train arriving from the direction A has N <= 1000 coaches numbered in increasing order 1, 2, ..., N. The chief for train reorganizations must know whether it is possible to marshal coaches continuing in the direction B so that their order will be a1, a2, ..., aN. Help him and write a program that decides whether it is possible to get the required order of coaches. You can assume that single coaches can be disconnected from the train before they enter the station and that they can move themselves until they are on the track in the direction B. You can also suppose that at any time there can be located as many coaches as necessary in the station. But once a coach has entered the station it cannot return to the track in the direction A and also once it has left the station in the direction B it cannot return back to the station.
Input
The last block consists of just one line containing 0.
Output
Sample Input
5 1 2 3 4 5 5 4 1 2 3 0 6 6 5 4 3 2 1 0 0
Sample Output
Yes NoYes
///此处上面还有一行空行;
///这个题很多大神多曾经发过题解了,但是大多采用的c语言的形式,而且没有详细解释各个部分的功能,而且这个题有个小坑点就是输入上,我一开始就是卡在了这上面,所以我对输入有一个比较详细的解释,目的是避免出现表达错误的情况。
///还有就是此处判断出栈规则的方法,仿照《算法竞赛入门经典》写成,建议去读一下,会对栈有更加深刻的理解。
#include<iostream> #include<cstdio> #include<cstring> #include<stack> #include<algorithm> using namespace std; int main() { int n; int target[2200]; while(~scanf("%d",&n))///输入也是个大问题啊。。 { if(n == 0) return 0; while(~scanf("%d",&target[1])) { if(target[1] == 0)///首先判断输入的第一个数 { puts("");///不要忘记换行. break; } for(int i = 2; i <= n; i++) scanf("%d",&target[i]); int a,b; a = b = 1; stack<int> s; bool mark = true; while(b <= n)///这就是判断是否符合出栈规则的核心; { if(a == target[b])///判断重位的元素; { a++; b++; } else if(!s.empty() && s.top() == target[b])///判断先进后出的规则,可以想象成倒叙。 { s.pop(); b++; } else if(a <= n)///之所以能这样,关键是因为入栈的顺序是连续的1~n数字; { s.push(a); a++; } else { mark = false; break; } } if(mark == true) printf("Yes\n"); else printf("No\n"); } } }