(File IO): input:cowcar.in output:cowcar.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
高速公路上有
N
(
1
<
=
N
<
=
50
,
000
)
N(1<=N<=50,000)
N(1<=N<=50,000)只奶牛,编号为
1..
N
1..N
1..N,每头牛都开着自己的车,第i头牛的车速为
S
i
(
1
<
=
S
i
<
=
1
,
000
,
000
)
k
m
/
h
S_i(1<=S_i<=1,000,000)km/h
Si(1<=Si<=1,000,000)km/h,告诉公路上一共有
M
M
M个车道
(
1
<
=
M
<
=
N
)
(1<=M<=N)
(1<=M<=N)。为了安全起见,每头牛都遵循以下原则:同车道前面有
x
x
x头牛,牛的车速就会降低
D
∗
X
(
0
<
=
D
<
=
5
,
000
)
K
M
/
h
D*X(0<=D<=5,000)KM/h
D∗X(0<=D<=5,000)KM/h,当然不会降到
0
0
0以下,所以车速应该
m
a
x
(
S
i
−
D
∗
X
,
0
)
max(S_i-D*X,0)
max(Si−D∗X,0)。由于车距很大,所以即使后面的车比前面的车快,你也不用担心会发生碰撞。
高速公路上有一个最低限速
L
(
1
<
=
L
<
=
1
,
000
,
000
)
L(1<=L<=1,000,000)
L(1<=L<=1,000,000),凡是低于该速度的车不允许上高速,现在请你来计算一共可以多少辆车在高速公路上行驶。
输入
第
1
1
1行:
4
4
4个空格隔开的整数
N
,
M
,
D
,
L
N,M,D,L
N,M,D,L;
第
2..
N
+
1
2..N+1
2..N+1行: 第
i
+
1
i+1
i+1行描述第i头牛的起初车速。
输出
一行:输出一个整数表示最多可以在高速上行驶的牛车数量。
样例输入
3 1 1 5
5
7
5
样例输出
2
数据范围限制
解题思路
这道题就是一道很明显的暴力枚举模拟。
从题中我们可以知道,在高速公路上,越靠后的牛速度衰减得越多,也就是说,将速度小的放在前面,而将速度大的放在后面是有利的,因此,可以先排序。
枚举赛车和赛道,如果这个赛道能放得下这个赛车的话,就将赛道和赛车指针都
+
1
+1
+1.如果不能,就换下一辆赛车。因为如果连这个赛道都放不下,那么后面的赛道的目前的赛车数量也跟这个赛道一样,这个赛道放不下,那么后面的肯定也放不下(理解一下,其实就是尽量让车平分赛道)。接下来输出
a
n
s
ans
ans即可。
代码
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
int n,m,d,l,k,ans,a[50010],b[50010];
string s;
int main(){
freopen("cowcar.in","r",stdin);
freopen("cowcar.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&d,&l);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
sort(a+1,a+n+1);
int i=1,j=1;
while(1)
{
k=a[i]-b[j]*d;
if(k>=l)
{
ans++;
b[j]++;
j++;
i++;
if(j>m)
j=1;
if(i>n)
break;
}
else
{
i++;
if(i>n)
break;
}
}
printf("%d",ans);
}