模拟题,逻辑很简单,但这题有一点没提到,只要是在下午五点之前到达的客户,都可以完成业务,就算超过五点才开始也是可以的,但五点之后到达就不行。
有些地方初始化没注意到,卡了很久。
//2020_01_19 20:50
/*
所有到银行的人都按到达时间排队,只要有空闲的窗口就可以开始业务
判断队列第一个人的到达时间是否小于当前时间,如果不是则要增加当前时间,如果是则寻找空闲窗口
如果有空闲窗口则开始业务,累加等待时间,并记录此人的结束时间;
如果没有空闲窗口则寻找结束时间最早的窗口并判断与当前时间的关系,是否需要更新当前时间
*/
#include<iostream>
#include<algorithm>
#define N 10000+10
#define K 100+10
using namespace std;
struct People{
int b,p,e;
bool operator <(const People &P){
return b<P.b;
}
}Peo[N];
int Bank[K];
int main()
{
//freopen("input.txt","r",stdin);
int n,k,c;
cin>>n>>k;
c=0;
for(int i=0;i<n;i++) {
int hh,mm,ss,p;
scanf("%d:%d:%d %d",&hh,&mm,&ss,&p);
if(hh*60*60+mm*60+ss<=17*60*60){
Peo[c].b=hh*60*60+mm*60+ss;
Peo[c].p=p*60;
c++;
}
}
for(int i=1;i<=k;i++)
Bank[i]=-1;
sort(Peo,Peo+c);
int time=8*60*60; //now time
int sum=0; //sum of all people waiting time
int p=0; //now position in array of Peo
int b=k; //now how many banks can suppose serve
while(p<c){
if(b==0){
int min,minp;
min=Peo[Bank[1]].e;
minp=1;
for(int i=1;i<=k;i++){
if(Peo[Bank[i]].e<min){
min=Peo[Bank[i]].e;
minp=i;
}
}
if(Peo[Bank[minp]].e>time){
time=Peo[Bank[minp]].e;
}
Bank[minp]=-1;
b++;
}
while(p<c&&b>0){
if(Peo[p].b<=time){
for(int i=1;i<=k;i++){
if(Bank[i]==-1){
Bank[i]=p;
Peo[p].e=time+Peo[p].p;
sum+=(time-Peo[p].b);
p++;
b--;
break;
}
}
}
else
time=Peo[p].b;
}
}
if(c==0)
printf("0.0");
else
printf("%.1f",double(sum/60.0/c));
return 0;
}