51nod 1279 單調棧
阿新 • • 發佈:2017-08-21
its 空間 好處 continue blank 最大 ret c++ .com
Input
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279
1279 扔盤子
題目來源: Codility 基準時間限制:1 秒 空間限制:131072 KB 分值: 10 難度:2級算法題 收藏 關註 有一口井,井的高度為N,每隔1個單位它的寬度有變化。現在從井口往下面扔圓盤,如果圓盤的寬度大於井在某個高度的寬度,則圓盤被卡住(恰好等於的話會下去)。 盤子有幾種命運:1、掉到井底。2、被卡住。3、落到別的盤子上方。 盤子的高度也是單位高度。給定井的寬度和每個盤子的寬度,求最終落到井內的盤子數量。 如圖井和盤子信息如下: 井:5 6 4 3 6 2 3 盤子:2 3 5 2 4 最終有4個盤子落在井內。 本題由 @javaman 翻譯。第1行:2個數N, M中間用空格分隔,N為井的深度,M為盤子的數量(1 <= N, M <= 50000)。 第2 - N + 1行,每行1個數,對應井的寬度Wi(1 <= Wi <= 10^9)。 第N + 2 - N + M + 1行,每行1個數,對應盤子的寬度Di(1 <= Di <= 10^9)Output
輸出最終落到井內的盤子數量。Input示例
7 5 5 6 4 3 6 2 3 2 3 5 2 4Output示例
4
有趣的一道題,對於每一層都有一個能容納的最大寬度hi,只要寬度小於等於hi的落下,當這一層未被占用且上方沒有放置的時候必定能落到這一層,這個hi是單調的。
把hi存入一個棧中掃描一遍答案就出來了,從底部的hi至上掃描,這樣做的好處是避免重復掃描,減小復雜度。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int N,M,i,j,k,wi,di,s=0; 6 cin>>N>>M; 7 stack<int>S; 8 int minv=2147483647; 9 for(i=1;i<=N;++i) 10 { 11 scanf("%d",&wi); 12 minv=min(minv,wi); 13 S.push(minv);14 } 15 for(i=1;i<=M;++i) 16 { 17 scanf("%d",&di); 18 if(S.empty()) continue; 19 while(!S.empty()&&S.top()<di) S.pop(); 20 if(!S.empty()&&S.top()>=di) {S.pop();s++;} 21 } 22 printf("%d\n",s); 23 return 0; 24 }
51nod 1279 單調棧