设置变量
win[ ]:每个窗口下次可以用来服务的时间
minT: 所有窗口中最早的那个,每次当客户来的时候,就选择最早的窗口
如何计算窗口的下一次的时间
① 如果客户先到,即p[i].st<minT,则窗口的下一次时间等于当前时间+用户占用时长,即 win[u]+=p[i].pro;
② 如果客户后到,即p[i].st≥minT,则窗口的下一次时间等于等于用户到达时间+用户占用时长,即win[u]=p[i].st+p[i].pro;
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
const int BE=8*3600;
const int ED=17*3600;
struct node{
int st,pro;
};
bool cmp(node a,node b){
return a.st<b.st;
}
int main()
{
int n,k,hh,mm,ss,tpro;
node p[10005];
cin>>n>>k;
for(int i=0;i<n;i++){
scanf("%d:%d:%d %d",&hh,&mm,&ss,&tpro);
p[i].st=hh*3600+mm*60+ss;
p[i].pro=tpro*60;
}
sort(p,p+n,cmp);
int win[105],cnt=0;
float sum=0;
for(int i=0;i<k;i++) win[i]=BE;
for(int i=0;i<n&&p[i].st<=ED;i++){
cnt++; //17:00之前到的人数加1
int minT=win[0],u=0;
for(int j=0;j<k;j++) //找到当前最早处于空闲的窗口
if(minT>win[j]) minT=win[j],u=j;
if(p[i].st<=minT){ //顾客先到的话--
sum+=minT-p[i].st; //①用窗口开始服务的时间减去顾客到来的时间然后加到sum上
win[u]+=p[i].pro; //②同时更新窗口本次服务完后的时间点
}
else win[u]=p[i].st+p[i].pro; //顾客后到的话--则无需等待,只用更新窗口时间
}
printf("%.1f",sum/(60*cnt));
return 0;
}