标签:false std bsp 否则 break for top amp else
本题是一道模拟,我们先构造一个栈,将1~n入栈,并用一个标记来表示当前比较到了所给序列的那一个元素.如果要入栈的元素与我们当前所标记的元素相同,则比较栈顶与我们下一个要标记到的元素,直到栈为空或这两个元素不相同为止,更新标记,接着循环直到1~n全部入栈.如果栈为空,则说明"Yes",如果不为空,我们就比较栈顶和标记元素,如果相同,就弹出栈顶;最后如果能做到栈为空则说明"Yes",否则为"No".
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 }
标签:false std bsp 否则 break for top amp else
原文地址:https://www.cnblogs.com/lipeiyi520/p/10666792.html