51nod 1279搬盤子
阿新 • • 發佈:2019-01-30
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; }