填坑Ⅱ | 簡單的數據結構

20. 填坑Ⅱ

成績 10 開啓時間 2020年09月17日 星期四 12:00
折扣 0.8 折扣時間 2020年09月24日 星期四 12:00
容許遲交 關閉時間 2020年10月10日 星期六 23:00

Description編程

emmm,仍是北湖深坑,不用驚喜,不用意外。數組

咱們繼續用石頭填!北湖的地面依舊是一維的,每一塊寬度都爲1,高度是非負整數,用一個數組來表示。數據結構

仍是提供不限量的1x2規格的石頭。可是這一次是 Dark來填坑,他有很強烈的強迫症,全部的石頭只能水平擺放(寬爲2,高爲1)。問這樣是否能夠將北湖填平。(全部地面到達同一高度即爲填平)測試

Inputspa

樣例有多組輸入至文件末尾;.net

每組用例佔兩行;code

第一行輸入1個整數 n表示北湖地面總寬度;blog

第二行輸入 n個整數,用空格間隔,表示地面高度。進程

Outputip

若能填平則輸出「YES」,不然輸出「NO」。

  測試輸入 期待的輸出 時間限制 內存限制 額外進程
測試用例 1
  1. 5↵
  2. 2 1 1 2 5↵
  3. 3↵
  4. 4 5 3↵
  5. 3↵
  6. 1 2 3↵
  1. YES↵
  2. NO↵
  3. NO↵
1秒 64M 0

        emmmm我總以爲個填坑Ⅱ和Ⅰ反了,可是怎麼今年依舊仍是這個順序....相信看懂Ⅰ的朋友這個Ⅱ真的小菜一碟! 

        第一題的傳送門,請看懂第一題再來看第二題:填坑Ⅱ | 簡單的數據結構

 

既然不能夠以1爲底2爲高去填,那麼與第一題的思路差異就是:

  1. 最後的結果斷定爲yes的條件:棧最後爲空 或 棧內剩餘的惟一元素必須是最高點(好好想一想這是爲啥)
  2. 咱們不能夠對坑進行預處理(將他們儘量填到最高處),咱們直接討論以後的狀況。狀況變得很是簡單:入棧的不是01,而是它們自己的高度!

       依次討論每個初始高度,若是相鄰的同高且兩側都比它們倆低,那麼能夠消去忽略不計。若是最後序列裏有超過一個元素或剩餘的惟一元素不是最高點,則輸出NO!若是在討論的過程當中,棧頂元素比棧內高,那咱們能夠沒必要繼續討論....


大家能夠多畫一些測試用例來理解如上思路,雞翅能力有限(兩點了,該睡會了)說不太明白,上面都是精華,剩下的就交給你們了~

附上完整ac代碼:

 

#include<cstdio>
#include<cstring>
#include<stack>

using namespace std;

long long int a[200010] = {0};
stack<int> stk;   //定義一個棧

int main() {
    long long int n, x = 2e18;

    //當存在輸入的時候
    while (scanf("%lld", &n) != EOF) {
        memset(a, 0, sizeof(a[0]));   //將數組初始化爲0
        while (!stk.empty())  //清空棧
            stk.pop();

        long long maxHeight = 0;
        for (long long i = 1; i <= n; i++) {
            scanf("%lld", &a[i]);
            //記下最高值
            if (a[i] > maxHeight)
                maxHeight = a[i];
        }

        for (long long height : a) {
            if (!stk.empty() && height == stk.top())  //棧非空且能夠對應時
                stk.pop();
            else {   //不能夠消去
                if (!stk.empty() && stk.top() < height)   //若是比前一個高
                    break;
                else  
                    stk.push(height);
            }
        }

        long long remainCount = stk.size();
        if (!remainCount)
            printf("YES\n");
        else if (remainCount == 1 && stk.top() == maxHeight)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

End

歡迎關注我的公衆號「雞翅編程」,這裏是認真且乖巧的碼農一枚,旨在用心寫好每一篇文章,日常會把筆記彙總成推送更新~

相關文章
相關標籤/搜索