模拟排队的过程,类似FCFS
用set的排序实现按顺序排队。
//1017 FCFS
map<string,int> cus;
set<string> cust;
char t[10];
int window[105];
int n,k,valid;
int get_sec(string t){
int sec;
int h = (t[0]-'0')*10+(t[1]-'0');
int m = (t[3]-'0')*10+(t[4]-'0');
int s = (t[6]-'0')*10+(t[7]-'0');
sec = h*60*60 + m*60 +s;
return sec;
}
void init(){
cus.clear();
cust.clear();
int startwork = get_sec("08:00:00");
for(int i=1;i<=k;i++) window[i] = startwork;
}
int process(){
int ans = 0,cnt = 0;
for(set<string>::iterator it=cust.begin();it!=cust.end();++it){
//转为秒数
string str = *it;
int mm = get_sec(str);
int startwork = get_sec("08:00:00");
int shortest = window[1],win=1;
//找到当前最先结束的窗口,相同取序号小的(这个其实没影响)
for(int i=k;i>=1;i--){
if(shortest>=window[i]){
shortest = window[i];
win = i;
}
}
//如果来了,没开门。或者没空窗,那么等
if(mm<window[win]){
ans += window[win] - mm;
window[win] += cus[str]*60;
}else{
//否则就是来了刚好有窗口或者来了之前就有空窗了
window[win] = mm + cus[str]*60;
}
}
return ans;
}
int main(){
int time_p,time_wait;
while(scanf("%d %d",&n,&k)!=EOF){
init();
valid = n;
time_wait = 0;
while(n--){
scanf("%s %d",t,&time_p);
if(strcmp("17:00:01",t)<=0) {valid--;continue;}
if(time_p>60) time_p = 60;
cus[t] = time_p;
cust.insert(t);
}
time_wait = process();
if(valid) printf("%.1lf\n",(time_wait/60.0)/valid);
else printf("0.0\n");
}
return 0;
}