51 nod 1279 扔盤子
阿新 • • 發佈:2017-06-06
div pan ext for ack logs 輸出 預處理 等於
有一口井,井的高度為N,每隔1個單位它的寬度有變化。現在從井口往下面扔圓盤,如果圓盤的寬度大於井在某個高度的寬度,則圓盤被卡住(恰好等於的話會下去)。
盤子有幾種命運:1、掉到井底。2、被卡住。3、落到別的盤子上方。
盤子的高度也是單位高度。給定井的寬度和每個盤子的寬度,求最終落到井內的盤子數量。
如圖井和盤子信息如下:
井:5 6 4 3 6 2 3
盤子:2 3 5 2 4
最終有4個盤子落在井內。
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
思路:
從底到頂判斷,預處理使下層井寬小於或等於上層。
代碼:
#include<cstdio> using namespace std; int a[50001],n,m,x,ans; int min(int x,int y) { return x<y?x:y; } int main() { int i,j; scanf("%d%d",&n,&m); a[0]=0x7fffffff; for(i=1;i<=n;i++) { scanf("%d",&a[i]); a[i]=min(a[i],a[i-1]); } for(i=1;i<=m;i++) { scanf("%d",&x); while(a[n]<x) n--; if(n>0) ans++,n--; } printf("%d",ans); return0; }
51 nod 1279 扔盤子