1623: [Usaco2008 Open]Cow Cars 奶牛飞车
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 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
*/