1. 程式人生 > >51nod 1279 單調棧

51nod 1279 單調棧

its 空間 好處 continue blank 最大 ret c++ .com

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 翻譯。
Input
第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
4
Output示例
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 單調棧