首页 > 代码库 > 优先队列

优先队列

描述 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;

}

 

优先队列