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
- 5↵
- 2 1 1 2 5↵
- 3↵
- 4 5 3↵
- 3↵
- 1 2 3↵
- YES↵
- NO↵
- NO↵
1秒 64M 0
emmmm我總以爲個填坑Ⅱ和Ⅰ反了,可是怎麼今年依舊仍是這個順序....相信看懂Ⅰ的朋友這個Ⅱ真的小菜一碟!
第一題的傳送門,請看懂第一題再來看第二題:填坑Ⅱ | 簡單的數據結構
既然不能夠以1爲底2爲高去填,那麼與第一題的思路差異就是:
- 最後的結果斷定爲yes的條件:棧最後爲空 或 棧內剩餘的惟一元素必須是最高點(好好想一想這是爲啥)
- 咱們不能夠對坑進行預處理(將他們儘量填到最高處),咱們直接討論以後的狀況。狀況變得很是簡單:入棧的不是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
歡迎關注我的公衆號「雞翅編程」,這裏是認真且乖巧的碼農一枚,旨在用心寫好每一篇文章,日常會把筆記彙總成推送更新~