POJ 1363 解題報告
阿新 • • 發佈:2019-01-25
這道題不難但是題目很難理解。看了測試樣例才明白,如果入棧順序是遞增的:1,2,3,4,5. 那麼給出一個出棧順序,比如5,4,1,2,3,判斷這個出棧順序是否可能。
我這裡就是按照題意模擬的。比如碰到5,就將小於等於5的都入棧(1,2,3,4,5),然是將5出棧(判斷這時棧頂一定是5),同樣地,之後遇到4,已經沒有什麼可入棧了,棧頂是4,出棧,再遇到1,同樣沒什麼可入棧的,棧頂元素是3,不是1,說明不可能。
1363 | Accepted | 156K | 110MS | C++ | 1354B |
/* ID: thestor1 LANG: C++ TASK: poj1363 */ #include <iostream> #include <fstream> #include <cmath> #include <cstdio> #include <cstring> #include <limits> #include <string> #include <vector> #include <list> #include <set> #include <map> #include <queue> #include <stack> #include <algorithm> #include <cassert> using namespace std; int main() { int N; scanf("%d", &N); while (N) { int num; scanf("%d", &num); // the number of numbers input int cnt = 1; // fprintf(stderr, "num: %d, cnt: %d\n", num, cnt); if (!num) { printf("\n"); scanf("%d", &N); continue; } int instacktop = 1; stack<int> outstack; bool flag = true; while (true) { while (instacktop <= N && instacktop <= num) { outstack.push(instacktop); instacktop++; } if (outstack.empty() || outstack.top() != num) { flag = false; break; } outstack.pop(); if (cnt == N) { break; } scanf("%d", &num); cnt++; // fprintf(stderr, "num: %d, cnt: %d\n", num, cnt); } // get the rest of numbers while (cnt < N) { scanf("%d", &num); cnt++; // fprintf(stderr, "num: %d, cnt: %d\n", num, cnt); } if (flag) { printf("Yes\n"); } else { printf("No\n"); } } return 0; }