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);
}