例題6-2 UVA 514
阿新 • • 發佈:2019-02-07
挺好的一道題目,想樣例程式碼也想了很久。
大體思路:
整體分為兩個過程,從A到C,從C到B,
用A代表要從A到C的編號序列,肯定是1到n了,
用B代表最終在B的車的編號。
讓A = 1,B = 1,B是最終車輛的陣列索引。
開始迴圈,發現A中的車等於B中的車,則說明了,這輛車要立即進站並且立即出站。
else 發現 B中的車等於棧C中的第一個,那麼說明此時,棧C的中的車要出站。
else 發現A中還有剩餘,則讓A進站。
否則無意義了 那就肯定NO了!
在一點輸出注意格式就OK了,我在一次沒有讀好題目,錯在格式上了,其實最後一組後是有空行的!
啟示:
這個題如果不這樣想的話,就是硬想的話,會變比較麻煩並且不知所措,所以這個題目給我一個啟示,那就是儘量把問題實際化,具體化,就是讓這個問題變得有實際意義,一項一項模擬,最後的else肯定就是不成立的了!
程式碼如下:
#include<stack> #include<cstdio> using namespace std; const int maxn = 1000 + 10; int a[maxn]; int main() { int n,cnt=0; while(scanf("%d",&n) == 1 && n){ while(scanf("%d",&a[1]) && a[1]){ for (int i = 2; i <= n; ++i)scanf("%d",&a[i]); stack<int>s; int A=1,B=1; bool ok=true; while(B <= n){ if (A == a[B]){A++;B++;} else if (!s.empty() && s.top() == a[B]){s.pop();B++;} else if(A <= n)s.push(A++); else {ok=false;break;} } printf("%s", ok ? "Yes\n" : "No\n"); } printf("\n"); } return 0; }