bzoj 1623: [Usaco2008 Open]Cow Cars 奶牛飞车(贪心)

1623: [Usaco2008 Open]Cow Cars 奶牛飞车

Time Limit: 5 Sec   Memory Limit: 64 MB
Submit: 578   Solved: 402
[ Submit][ Status][ Discuss]

Description

  编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000).
    在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生.每条车道上,如果某一只奶牛i的前面有K只奶牛驾车行驶,那奶牛i的速度上限就会下降K*D个单位,也就是说,她的速度不会超过Si - kD(O≤D≤5000),当然如果这个数是负的,那她的速度将是0.牛德比亚的高速会路法规定,在高速公路上行驶的车辆时速不得低于/(1≤L≤1,000,000).那么,请你计算有多少奶牛可以在高速公路上行驶呢?

Input

第1行输入N,M,D,L四个整数,之后N行每行一个整数输入Si.
N<=50000

Output

    输出最多有多少奶牛可以在高速公路上行驶.

Sample Input

3 1 1 5
5
7
5

Sample Output

2


贪心:每条路都让速度慢的牛在前面

公路上每有一头牛后面所有牛的速度都减去D == 公路的最低速度要求+D

用顶端最小的优先队列存下所有公路的最低速度要求,然后所有牛按速度从小到大排序

每次看当前牛是否可以在当前速度要求最低的高速公路上行驶


#include<stdio.h>
#include<functional>
#include<queue>
#include<algorithm>
using namespace std;
priority_queue<int, vector<int>, greater<int> > q;
int c[50005];
int main(void)
{
	int n, i, m, d, k, ans, now;
	scanf("%d%d%d%d", &n, &m, &d, &k);
	for(i=1;i<=n;i++)
		scanf("%d", &c[i]);
	sort(c+1, c+n+1);
	for(i=1;i<=m;i++)
		q.push(k);
	ans = 0;
	for(i=1;i<=n;i++)
	{
		if(c[i]>=q.top())
		{
			now = q.top();
			q.pop();
			q.push(now+d);
			ans++;
		}
	}
	printf("%d\n", ans);
	return 0;
}
/*
3 1 1 5
5 7 5
*/

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页