POJ 1363 Rails

解题思路:

本题是一道模拟,我们先构造一个栈,将1~n入栈,并用一个标记来表示当前比较到了所给序列的那一个元素.如果要入栈的元素与我们当前所标记的元素相同,则比较栈顶与我们下一个要标记到的元素,直到栈为空或这两个元素不相同为止,更新标记,接着循环直到1~n全部入栈.如果栈为空,则说明"Yes",如果不为空,我们就比较栈顶和标记元素,如果相同,就弹出栈顶;最后如果能做到栈为空则说明"Yes",否则为"No".

AC代码:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <stack>
 5 
 6 using namespace std;
 7 const int N = 1e5+5;
 8 
 9 int n, a[N];
10 
11 bool solve() {
12     stack<int> st;
13     int p = 1;//p为标记 
14     for(int i=1; i<=n; i++) {
15         while(true) {
16             if(p <= n && a[i] == p) {
17                 p++;
18                 break;
19             }
20             else if(!st.empty() && a[i] == st.top()) {
21                 st.pop();
22                 break;
23             }
24             else {
25                 if(p <= n) st.push(p++);
26                 else return false;
27             }
28         }
29     }
30     return true;
31 }
32 
33 int main() {
34     while(cin >> n && n) {
35         while(true) {
36             cin >> a[1];
37             if(a[1] == 0) break;
38             for(int i=2; i<=n; i++) cin >> a[i];
39             cout << (solve() ? "Yes" : "No") << "\n";
40         }
41         puts("");
42     }
43 }

猜你喜欢

转载自www.cnblogs.com/lipeiyi520/p/10666792.html