Convention II 题解

题面:

在这里插入图片描述

翻译:

农民约翰的农场吸引了大量奶牛前来吃草.
但是他的农场一次只能容纳一头奶牛同时吃草,所以奶牛需要排队.
每头牛都会在某一时刻到达,如果到达的时候农场是空闲的,那么他马上开始吃草,并且在一段时间后吃完.
如果在他到达时农场不为空,那么他等待前面的奶牛吃完,才开始吃
如果在农场空闲下来的那个时刻,有多头奶牛在等待,那么优先度高的那一头先吃(先输入的优先度高)
计算所有牛所需的等待时间的总和

输入:

第一行为一个数字n,代表下面有多少头奶牛(先输入的奶牛优先度高)
下面n行,每行包括两个数字,分别是奶牛的到达时间和奶牛所需的吃草时间.

输出:

一个数字,所有牛的总共的等待时间.

题目分析:

我们先按照到达时间,把每头牛排序.
用一个变量time来记录当前时间.
首先第一头到达的牛开始吃草.
一直吃到结束,time更新.
这时判断有哪些牛在time之前到达,把他们都放进一个优先队列中(队列按优先度排序).

然后从队列中取出优先度最高的牛,让他吃草,更新时间(同时更新等待时间).
然后再把time之前到达的奶牛入队.

直到队列为空并且所有奶牛都已经入过队.
最后把记录等待时间的变量输出.

代码:

#include<bits/stdc++.h>

using namespace std;

long n, now, maxTime;

class cow{
public:
    long a, t, num;
    bool operator < (const cow & C) const{
        return num > C.num;
    }
} cows[100100];

bool cmp(cow c1, cow c2){
    return c1.a < c2.a;
}

priority_queue <cow> wait;

int main(){
    scanf("%ld", &n);
    for(long i = 0; i < n; cows[i].num = ++i) scanf("%ld%ld", &cows[i].a, &cows[i].t);

    sort(cows, cows+n, cmp);
    now = 0;
    maxTime = 0;
    long i = 0;
    while(i < n || !wait.empty()){
        if(now == 0){
            wait.push(cows[i++]);
        }else{
            while((i < n && now > cows[i].a) || wait.empty()){
                wait.push(cows[i++]);
            }
        }
        if(maxTime < now - wait.top().a){
            maxTime = now - wait.top().a;
        }
        if(now < wait.top().a)
            now = wait.top().a + wait.top().t;
        else
            now = wait.top().t + now;
        wait.pop();
    }
    printf("%ld\n", maxTime);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值