7-3 银行排队问题之单队列多窗口服务 (25 分)
7-3 銀行排隊問題之單隊列多窗口服務 (25 分)
假設銀行有K個窗口提供服務,窗口前設一條黃線,所有顧客按到達時間在黃線后排成一條長龍。當有窗口空閑時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客總是選擇編號最小的窗口。
本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最后完成時間,并且統計每個窗口服務了多少名顧客。
輸入格式:
輸入第1行給出正整數N(≤1000),為顧客總人數;隨后N行,每行給出一位顧客的到達時間T和事務處理時間P,并且假設輸入數據已經按到達時間先后排好了順序;最后一行給出正整數K(≤10),為開設的營業(yè)窗口數。這里假設每位顧客事務被處理的最長時間為60分鐘。
輸出格式:
在第一行中輸出平均等待時間(輸出到小數點后1位)、最長等待時間、最后完成時間,之間用1個空格分隔,行末不能有多余空格。
在第二行中按編號遞增順序輸出每個窗口服務了多少名顧客,數字之間用1個空格分隔,行末不能有多余空格。
輸入
9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3
題目分析: 錯了幾次,純粹的模擬,注意客人到窗口的時間和窗口開放時間的關系即可,若客人比所有窗口的開放時間都小,客人就會進最小的那個,到來時間只要比最小大,從左到右遍歷,第一個進去即可。
你也可以這樣想,假如我早早的來到黃線等候,那么我肯定是等到最近一個available的窗口,假如我來的比較晚,那么我肯定是從左向右,那個available就去那個。
代碼
>#include <bits/stdc++.h> using namespace std; struct consumer {int arr; //arriveint pro; //processint wait; }a[1001]; struct gate {int stt=0; //start timeint n=0; }b[11],ss[11]; bool cmp(struct consumer x,struct consumer y) {return x.wait>y.wait; } bool cmmp(struct gate x,struct gate y) {return x.stt>y.stt; } int main() {int n,ar,pr;double waitsum=0;cin>>n;for (int i=0;i<n;i++){cin>>ar>>pr;if (pr>60) pr=60;a[i].arr=ar;a[i].pro=pr;}int k,count=0;cin>>k;while (count<n){ //到的時間比所有窗口的stt都晚,就進入第一個窗口,否則進入第一個stt最小的窗口. // for (int i=0;i<k;i++) // { // printf("%d的開始時間是%d\n\n",i,b[i].stt); // }int t=0;for (int i=1;i<k;i++){if (b[i].stt<b[t].stt){t=i;}}if (a[count].arr<=b[t].stt){b[t].n++;a[count].wait=b[t].stt-a[count].arr;waitsum+=a[count].wait;b[t].stt+=a[count].pro;count++;}else if (a[count].arr>b[t].stt){int appr;for (int i=0;i<k;i++){if (a[count].arr>=b[i].stt){appr=i;break;}}b[appr].n++;a[count].wait=0;b[appr].stt=a[count].arr+a[count].pro;count++;}}int sss=0;for (int i=0;i<k;i++){ss[sss++].n=b[i].n;}sort(a,a+count,cmp);sort(b,b+k,cmmp);printf("%.1lf %d %d",waitsum/n,a[0].wait,b[0].stt);printf("\n");printf("%d",ss[0].n);for (int i=1;i<k;i++){printf(" %d",ss[i].n);} }總結
以上是生活随笔為你收集整理的7-3 银行排队问题之单队列多窗口服务 (25 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【剑指offer】面试题58 - I:翻
- 下一篇: 【剑指offer】面试题05:替换空格(