模擬排隊的過程,類似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;
}