1. 程式人生 > >51 nod 1279 扔盤子

51 nod 1279 扔盤子

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); return
0; }

51 nod 1279 扔盤子