1. 程式人生 > >A. 【NOIP2018普及級別模擬】牛車

A. 【NOIP2018普及級別模擬】牛車

時間限制: 1000 ms 空間限制: 131072 KB 具體限制

題目描述

高速公路上有N(1<=N<=50,000)只奶牛,編號為1..N,每頭牛都開著自己的車,第i頭牛的車速為S_i(1<=S_i<=1,000,000)km/h,告訴公路上一共有M個車道(1<=M<=N)。

為了安全起見,每頭牛都遵循以下原則:同車道前面有x頭牛,牛的車速就會降低DX(0<=D<=5,000)KM/h,當然不會降到0以下,所以車速應該max(S_i-DX,0)。由於車距很大, 所以即使後面的車比前面的車快,你也不用擔心會發生碰撞。

高速公路上有一個最低限速L(1<=L<=1,000,000),凡是低於該速度的車不允許上高速,現在請你來計算一共可以多少輛車在高速公路上行駛。

輸入

第1行: 4個空格隔開的整數N,M,D,L

第2..N+1行: 第i+1行描述第i頭牛的起初車速。

輸出

第一行: 輸出一個整數表示最多可以在高速上行駛的牛車數量。

樣例輸入

3 1 1 5

5

7

5

樣例輸出

2

資料範圍限制

題解:

直接就是排序加貪心,一個車道一個車道從慢到快

這道題資料範圍也不是特別大,測試資料也沒有太卡,所以用O(nm)的演算法就行了。

程式碼:

#include<iostream>#include<cmath>#include<cstring>#include<cstdio>
#include<cstdlib>#include<algorithm>usingnamespace std;constint MAXN=50010;longlong n,m,d,l,v[MAXN],a[MAXN];longlong sum,x;intmain(){ cin>>n>>m>>d>>l;for(longlong i=1;i<=n;i++){scanf("%lld",&v[i]); v[i]-=l; //預處理}sort(v+1,v+1+n);//排序(從小到大)for(longlong i=1;i<=
n;i++){for(longlong j=1;j<=m;j++){if(v[i]-a[j]>=0){ a[j]+=d; //本車道車的數量加一 sum++;break;}}} cout<<sum;return0;}