2020.03.14模拟赛16(第三题)

3.牛车(cowcar)

题目描述

高速公路上有N(1<=N<=50,000)只奶牛,编号为1…N,每头牛都开着自己的车,第i头牛的车速为S_i(1<=S_i<=1,000,000)km/h,告诉公路上一共有M个车道(1<=M<=N)。为了安全起见,每头牛都遵循以下原则:同车道前面有x头牛,牛的车速就会降低D乘X(0<=D<=5,000)KM/h,当然不会降到0以下,所以车速应该max(S_i-D*X,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

正解
一个暴力贪心算法,要记得先快排,从小到大
主要程序
首先将指针指向第一位,
然后看能不能塞下一辆车,能就这条车道的车辆数加一,否则就看有没有新车道,有就将这辆车放到新车道上,那条车道的车加一
最后,我们塞下一个车就累加一,结果就是累加的答案
AC代码

#include
#include
#include
using namespace std;
long long n,m,d,l,s,m1,x[50005],a[50005];
int main()
{
	freopen("cowcar.in","r",stdin);
	freopen("cowcar.out","w",stdout);
	cin>>n>>m>>d>>l;
	for(int i=1;i<=n;i++)
	 cin>>a[i];
	sort(a+1,a+n+1);//快排
	m1++;//先开个新车道
	for(int i=1;i<=n;i++)
	 if(a[i]>=l)//如果车速大于l就进了
	  for(int j=1;j<=m1;j++)//枚举每个车道
	  {
		if(a[i]-d*x[j]>=l)//如果塞得下就塞
		{
			s++;//累加
			x[j]++;//车辆数累加
			break;//塞完了,结束
		}	
		if(a[i]-d*x[j]<l&&m1<m)//不能塞
		{
			m1++;//新开车道
			s++;//累加
			x[m1]=1; //车辆数为1
			break;//塞完了,结束
		} 
	  }
	cout<<s;  //累加总和
	return 0;
}

下面附本次比赛的其它题目

2020.03.14模拟赛16(第一题)
2020.03.14模拟赛16(第二题)
2020.03.14模拟赛16(第三题)
2020.03.14模拟赛15(第四题)
2020.03.14模拟赛15(总结)

谢谢

你可能感兴趣的:(赛后分析)