1. 程式人生 > >例題6-2 UVA 514

例題6-2 UVA 514

挺好的一道題目,想樣例程式碼也想了很久。

大體思路:

整體分為兩個過程,從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;
}