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

51nod 1279搬盤子

1279 扔盤子
基準時間限制: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

解題思路:如果下面能放盤子,那麼他上面的寬度一定大於等於下面,那就可以預處理一下寬度由大到小,省去了中間的判斷。
讓後放盤子就行了,能放就放。

程式碼如下:


#include <cstdio>
#include<algorithm>
using namespace std;
int a[50010];
int z[50010];
int cnt=0;
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	a[0]=1e9+10;
	//printf("%d\n",a[0]); 
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		if(a[i]>a[i-1])a[i]=a[i-1];
	}
	int k=n;//當前口的位置
	for(int i=1;i<=m;i++)
	{
	    scanf("%d",&z[i]);
	    for(int j=k;j>=1;j--)
	    {
	    	k=j-1;//可以落到上一個盤子上
	    	if(z[i]<=a[j])
	    	{
	    		cnt++;
	    		break;
	    	}
	    }
	  
	}
	printf("%d\n",cnt);
    return 0;
}