```
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<queue>//小根堆头文件
using namespace std;
const int N=10010,M=110;
int n,m;//m窗口数
struct Person //存客户
{
int arrive_time; //到达时间
int service_time; //服务时间
}persons[N]; //多个人,是一个数组
bool cmp(Person a,Person b)
{
return a.arrive_time<b.arrive_time; //按照到达时间排序,早到排在前
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
int hour,minute,second,service_time;
scanf("%d:%d:%d %d",&hour,&minute,&second,&service_time);
service_time=min(service_time,60);
persons[i]={hour*3600+minute*60+second,service_time*60}; //从凌晨算起,转化为秒数
}
priority_queue<int,vector<int>,greater<int>> windows; //小根堆
for(int i=0;i<m;i++) windows.push(8*3600); //先把m个窗口安排好
sort(persons,persons+n,cmp);
int sum=0, cnt=0;//总等待时间和人数,并不是所有人都服务的到
for(int i=0;i<n;i++)
{
auto person=persons[i];
int w=windows.top(); //找到最小窗口 ,w为当前窗口结束的时间
windows.pop(); //需要更新,先删掉
if(person.arrive_time>17*3600) break; //17:00之后到达,不服务了
int start_time=max(person.arrive_time,w);
sum+=start_time-person.arrive_time;
cnt++;
windows.push(start_time+person.service_time);
}
printf("%.1lf\n",(double)sum/cnt/60);
return 0;
}