Convention II(优先队列)

题目

  • Problem Description
    Despite long delays in airport pickups, Farmer John’s convention for cows interested in eating grass has been going well so far. It has attracted cows from all over the world.

    The main event of the conference, however, is looking like it might cause Farmer John some further scheduling woes. A very small pasture on his farm features a rare form of grass that is supposed to be the tastiest in the world, according to discerning cows. As a result, all of the N cows at the conference (1≤N≤105) want to sample this grass. This will likely cause long lines to form, since the pasture is so small it can only accommodate one cow at a time.

    Farmer John knows the time ai that each cow i plans to arrive at the special pasture, as well as the amount of time ti she plans to spend sampling the special grass, once it becomes her turn. Once cow i starts eating the grass, she spends her full time of ti before leaving, during which other arriving cows need to wait. If multiple cows are waiting when the pasture becomes available again, the cow with the highest seniority is the next to be allowed to sample the grass. For this purpose, a cow who arrives right as another cow is finishing is considered “waiting”. Similarly, if a number of cows all arrive at exactly the same time while no cow is currently eating, then the one with highest seniority is the next to eat.

    Please help FJ compute the maximum amount of time any cow might possibly have to wait in line (between time ai and the time the cow begins eating).

  • Input
    The first line of input contains N. Each of the next N lines specify the details of the N cows in order of seniority (the most senior cow being first). Each line contains ai and ti for one cow. The ti’s are positive integers each at most 104, and the ai’s are positive integers at most 109.

  • Output
    Please print the longest potential waiting time over all the cows.

  • input
    5
    25 3
    105 30
    20 50
    10 17
    100 10

  • output
    10

题意

一群牛来排队吃草,每头牛有到达时间,吃草时间 和 等级,越前面输入的牛等级越高,在共同等待時拥有更高的优先级
求奶牛的最长等待时间

思路

将牛按到达时间排序,维护每次吃草结束的时间 和 等待队列
每次吃草结束后,将到达时间 早于 当前吃草结束时间的牛 放入优先队列,优先队列按等级排序,每当有牛吃完草 且 队伍不为空時,队列中的第一个元素即为等级最高的在等待中的牛,让这头牛进去吃草,同时计算这头牛的等到时间 和 吃完草的结束时间,循环,直到全部牛吃完,得到最大等待时间
队列为空时则直接补上下一个到达的牛

代码

#include <bits/stdc++.h>
using namespace std;

struct node {
    int s;
    int e;
    int senior;

    bool friend  operator < (const node &a,const node &b) {
        if(a.s!=b.s)
            return a.s<b.s;
        else
            return a.senior<b.senior;
    }//用于到达时间排序
    
    bool friend operator > (const node &a,const node &b) {
        return a.senior>b.senior;
    }//用于等级排序
} temp_cow;

vector<node>cow;
int N;

int main() {
    scanf("%d",&N);
    temp_cow.senior=0;
    for(int n=1; n<=N; ++n) {
        scanf("%d%d",&temp_cow.s,&temp_cow.e);
        ++temp_cow.senior;
        cow.push_back(temp_cow);
    }
    sort(cow.begin(),cow.end());

    priority_queue<node,vector<node>, greater<node> > que;

    int k=0;
    int time=cow[k].s+cow[k].e;//维护时间
    ++k;
    int Max_wait=0;

    while( k<N or !que.empty() ) {
        while(k<N) {
            if(cow[k].s<=time) {//到达时间 早于 当前吃草结束时间的牛入队
                que.push(cow[k]);
                ++k;
            }
            else break;
        }
        if(!que.empty()) {//计算等待时间
            Max_wait = max(Max_wait,time-que.top().s);
            time+=que.top().e;
            que.pop();
        }
        else {//如果队列为空,补上下一个到达的牛
            time=cow[k].s+cow[k].e;
            ++k;
        }
    }
    printf("%d\n",Max_wait);

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值