PAT 甲级 1017 Queueing at Bank

PAT 甲级 1017 Queueing at Bank

#include <bits/stdc++.h>
using namespace std;
int n,k;
struct Msg{
    int arrive,cost,beg,leave; // 到达、花费、开始、离开,单位:秒。
    Msg(int _arrive=0,int _cost=0):arrive(_arrive),cost(_cost){}
    bool operator< (const Msg &rhs) const {return leave>rhs.leave;}
};
vector<Msg> msg;
int main(){
    cin>>n>>k;
    for(int i=0;i<n;++i){
        int hh,mm,ss,c,arrive;
        scanf("%d:%d:%d %d",&hh,&mm,&ss,&c);
        arrive=hh*3600+mm*60+ss;
        if(arrive>17*3600) continue;
        msg.emplace_back(arrive,min(c*60,3600));
    }
    sort(msg.begin(),msg.end(),[](Msg &a,Msg &b){return a.arrive<b.arrive;});
    priority_queue<Msg> q;
    for(int i=0;i<msg.size();++i){
        if(q.size()<k){
            msg[i].beg=max(msg[i].arrive,8*3600);
            msg[i].leave=msg[i].beg+msg[i].cost;
            q.push(msg[i]);
        }else{
            int now=q.top().leave;q.pop();
            msg[i].beg=max(msg[i].arrive,now);
            msg[i].leave=msg[i].beg+msg[i].cost;
            q.push(msg[i]);
        }
    }
    int sum=0;
    for(int i=0;i<msg.size();++i){
        sum+=msg[i].beg-msg[i].arrive;
    }
    double avg=sum/60.0/msg.size();
    printf("%.1lf",avg);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值