PTA 銀行排隊問題之單隊列多窗口服務(25 分)

 銀行排隊問題之單隊列多窗口服務(25 分)

假設銀行有K個窗口提供服務,窗口前設一條黃線,全部顧客按到達時間在黃線後排成一條長龍。當有窗口空閒時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客老是選擇編號最小的窗口。node

本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最後完成時間,而且統計每一個窗口服務了多少名顧客。數組

輸入格式:

輸入第1行給出正整數N(1000),爲顧客總人數;隨後N行,每行給出一位顧客的到達時間T和事務處理時間P,而且假設輸入數據已經按到達時間前後排好了順序;最後一行給出正整數K(10),爲開設的營業窗口數。這裏假設每位顧客事務被處理的最長時間爲60分鐘。spa

輸出格式:

在第一行中輸出平均等待時間(輸出到小數點後1位)、最長等待時間、最後完成時間,之間用1個空格分隔,行末不能有多餘空格。code

在第二行中按編號遞增順序輸出每一個窗口服務了多少名顧客,數字之間用1個空格分隔,行末不能有多餘空格。blog

輸入樣例:

9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3

輸出樣例:

6.2 17 61
5 3 1

思路:隊列

先經過輸入將隊列保存在數組中,以後用隊列頭元素的到達時間跟窗口的完成時間對比,由於題中說優先考慮近的窗口,因此能夠遍歷窗口。若是隊首的到達時間比這個窗口的完成時間大,就不須要等待,更新這個窗口的等待時間,而且這個窗口人數加一,若是這個窗口沒法服務,就求出這個窗口的最快完成時間。若是三個窗口都沒法知足,就須要等待,而且求出等待的時間而且用下表記錄。最後將須要等待的時間和完成的時間都記錄下來。最後將題目要求的數據輸出就行。事務

 

 

#include<stdio.h> #include<stdlib.h> typedef struct node { int t, p;//到達時間,處理時間 
}ST; ST q[1005];//數組模擬隊列 
int main() { int l, r, n, k, i; while(~scanf("%d", &n)) { l = r = 0;//隊列頭和尾 
        for(i = 0; i < n; i++) { scanf("%d %d", &q[r].t, &q[r].p);//將輸入的數入隊列 
            if(q[r].p > 60) q[r].p = 60;//根據題目要求,最大處理時間60 
            r++; } scanf("%d", &k);//k個窗口 
        int sumwait = 0, lenwait = 0, wait = 0;//總的等待時間, 最長的等待時間, 單次等待時間 
        int sum[15] = {0}, winnum[15] = {0};//完成時間,窗口人數 
        while(l < r) { int flag = 0, minn = 99999, imin = 0;//標記變量, 最快的完成時間, 最快完成時間的下標 
            for(i = 0; i < k; i++)//遍歷k個窗口 
 { if(sum[i] < q[l].t)//若是隊列首位,到達時間比,完成時間大,就表明不須要等待 
 { sum[i] = q[l].t + q[l].p;//更新完成這個窗口完成的時間 
                    winnum[i]++;//窗口人數加一 
                    flag = 1;//標記一下,表明不須要等待 
                    l++;//隊列首位除去 
                    break;//退出循環 
 } if(minn > sum[i])//若是須要等待,就記錄各個窗口裏最快完成的那個窗口的完成時間,和下標 
 { minn = sum[i]; imin = i; } } if(!flag)//須要等待 
 { wait = minn - q[l].t;//等待的時間,最快完成的時間減去隊列第一我的到達的時間 
                if(lenwait < wait) lenwait = wait;//不斷更新等待的最長時間 
                sumwait += wait;//求等待時間的和 
                sum[imin] = minn + q[l].p;//更新對應窗口的完成時間 
                winnum[imin]++;//對應窗口人數++ 
                l++;//隊列刪除首位 
 } } int last = 0; for(i = 0; i < k; i++) { if(last < sum[i]) last = sum[i];//求最大完成時間 
 } printf("%.1lf %d %d\n", 1.0 * sumwait / n, lenwait, last);//輸出,平均等待時間, 最長等待時間, 最後完成時間 
        for(i = 0; i < k; i++) { printf("%d", winnum[i]);//輸出各個窗口的人數 
            if(i == k - 1) printf("\n"); else printf(" "); } } return 0; } 
相關文章
相關標籤/搜索