本题考察优先队列使用,如何维护优先队列?
注意:最终人数!=输出的n
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct node{
int arrive;
int solve;
}p[10010];
bool cmp1(node p1,node p2){
return p1.arrive<p2.arrive;
}
int ans=0;
int main(){
int n,k,cnt=0;
scanf("%d%d",&n,&k);
int h,m,s,ari,deal;
for(int i=0;i<n;i++){
scanf("%d:%d:%d %d",&h,&m,&s,&deal);
ari=3600*h+60*m+s;
if(ari<=61200){
p[cnt].arrive=ari;
p[cnt++].solve=deal*60;
}
}
sort(p,p+cnt,cmp1);
priority_queue<int ,vector<int>,greater<int>> q;
for(int i=0;i<k;i++){
q.push(28800);
}
for(int i=0;i<cnt;i++){
if(q.top()<=p[i].arrive){
q.push(p[i].arrive+p[i].solve);
q.pop();
}
else{
ans+=q.top()-p[i].arrive;
q.push(q.top()+p[i].solve);
q.pop();
}
}
cnt==0?printf("0.0"):printf("%.1f",(ans*1.0)/(60*cnt));
return 0;
}