PAT 甲級 1017 Queueing at Bank【模擬】

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章