資料結構課設 銀行排隊問題之單佇列多視窗服務
阿新 • • 發佈:2019-01-07
5-7 銀行排隊問題之單佇列多視窗服務 (25分)
假設銀行有K個視窗提供服務,視窗前設一條黃線,所有顧客按到達時間在黃線後排成一條長龍。當有視窗空閒時,下一位顧客即去該視窗處理事務。當有多個視窗可選擇時,假設顧客總是選擇編號最小的視窗。
本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最後完成時間,並且統計每個視窗服務了多少名顧客。
輸入格式:
輸入第1行給出正整數N(≤1000),為顧客總人數;隨後N行,每行給出一位顧客的到達時間T
和事務處理時間P
,並且假設輸入資料已經按到達時間先後排好了順序;最後一行給出正整數K(≤10),為開設的營業視窗數。這裡假設每位顧客事務被處理的最長時間為60分鐘。
輸出格式:
在第一行中輸出平均等待時間(輸出到小數點後1位)、最長等待時間、最後完成時間,之間用1個空格分隔,行末不能有多餘空格。
在第二行中按編號遞增順序輸出每個視窗服務了多少名顧客,數字之間用1個空格分隔,行末不能有多餘空格。
輸入樣例:
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 <iostream> #include <cstdio> #include <queue> using namespace std; struct node { int t, p; }; int main() { int n; scanf("%d", &n); queue <node> q; int i; for(i = 0; i < n; i++) { node tmp; scanf("%d %d", &tmp.t, &tmp.p); if(tmp.p > 60) tmp.p = 60; q.push(tmp); } int k; scanf("%d", &k); int win[15] = {0}, num[15] = {0}; int wait = 0, maxn = 0, sum = 0; while(!q.empty()) { int flag = 0; int minn = 0x3f3f3f3f, imin = 0; for(i = 0; i < k; i++) { if(win[i] < q.front().t) { win[i] = q.front().t + q.front().p; num[i]++; flag = 1; q.pop(); break; } if(minn > win[i]) { minn = win[i]; imin = i; } } if(flag == 0) { wait = win[imin] - q.front().t; win[imin] += q.front().p; if(maxn < wait) maxn = wait; sum += wait; num[imin]++; q.pop(); } } int last = win[0]; for(i = 0; i < k; i++) { if(win[i] > last) last = win[i]; } printf("%.1lf %d %d\n", sum * 1.0 / n * 1.0, maxn, last); for(i = 0; i < k; i++) { printf("%d", num[i]); if(i != k - 1) printf(" "); else printf("\n"); } return 0; }