首页 > 代码库 > 优先队列
优先队列
描述 Description
编号为1到N的N只奶牛正各自驾着车打算在牛德比亚的高速公路上飞驰.高速公路有M(1≤M≤N)条车道.奶牛i有一个自己的车速上限Si(l≤Si≤1,000,000).
在经历过糟糕的驾驶事故之后,奶牛们变得十分小心,避免碰撞的发生.每条车道上,如果某一只奶牛i的前面有南只奶牛驾车行驶,那奶牛i的速度上限就会下降kD个单位,也就是说,她的速度不会超过Si - kD(O≤D≤5000),当然如果这个数是负的,那她的速度将是0.牛德比亚的高速会路法规定,在高速公路上行驶的车辆时速不得低于/(1≤L≤1,000,000).那么,请你计算有多少奶牛可以在高速公路上行驶呢?
输入格式 InputFormat
第1行输入N,M,D,L四个整数,之后N行每行一个整数输入Si.
输出格式 OutputFormat
输出最多有多少奶牛可以在高速公路上行驶.
样例输入 SampleInput
5 1 1 10
5
15
7
18
3
样例输出 SampleOutput
2
数据范围和注释 Hint
N≤50000.
#include <stdio.h>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <functional>
using namespace std;
int s[50005];
int i,j,t,n,m,l,r,k,z,y,x,d,ans;
priority_queue<int,vector<int>,greater<int> > pq;
int main()
{
scanf("%d%d%d%d",&n,&m,&d,&l);
for (i=1;i<=n;i++) scanf("%d",&s[i]);
sort(s+1,s+n+1);
for (i=1;i<=m;i++) pq.push(0);
ans=0;
for (i=1;i<=n;i++)
{
t=pq.top();
if (s[i]-t*d>=l)
{
ans++;
pq.pop();
pq.push(t+1);
}
}
printf("%d\n",ans);
return 0;
}
优先队列