7-4 银行排队问题之单队列多窗口加VIP服务 (30 分)
7-4 銀行排隊問題之單隊列多窗口加VIP服務 (30 分)
說實話這道題挺惡心 有意思的,大模擬,主要的思路就是模擬時間軸。
題目描述
假設銀行有K個窗口提供服務,窗口前設一條黃線,所有顧客按到達時間在黃線后排成一條長龍。當有窗口空閑時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客總是選擇編號最小的窗口。
有些銀行會給VIP客戶以各種優惠服務,例如專門開辟VIP窗口。為了最大限度地利用資源,VIP窗口的服務機制定義為:當隊列中沒有VIP客戶時,該窗口為普通顧客服務;當該窗口空閑并且隊列中有VIP客戶在等待時,排在最前面的VIP客戶享受該窗口的服務。同時,當輪到某VIP客戶出列時,若VIP窗口非空,該客戶可以選擇空閑的普通窗口;否則一定選擇VIP窗口。
本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最后完成時間,并且統計每個窗口服務了多少名顧客。
輸入格式:
輸入第1行給出正整數N(≤1000),為顧客總人數;隨后N行,每行給出一位顧客的到達時間T、事務處理時間P和是否VIP的標志(1是VIP,0則不是),并且假設輸入數據已經按到達時間先后排好了順序;最后一行給出正整數K(≤10)—— 為開設的營業窗口數,以及VIP窗口的編號(從0到K?1)。這里假設每位顧客事務被處理的最長時間為60分鐘。
輸出格式:
在第一行中輸出平均等待時間(輸出到小數點后1位)、最長等待時間、最后完成時間,之間用1個空格分隔,行末不能有多余空格。
在第二行中按編號遞增順序輸出每個窗口服務了多少名顧客,數字之間用1個空格分隔,行末不能有多余空格。
輸入樣例:
10 0 20 0 0 20 0 1 68 1 1 12 1 2 15 0 2 10 0 3 15 1 10 12 1 30 15 0 62 5 1 3 1輸出樣例:
15.1 35 67 4 5 1 #include <bits/stdc++.h> struct consumer {double arrive;double process;double start;double end;double wait;int vip;int skip; }c[1001]; struct windows {int count;int availiable;double end; }w[11]; using namespace std; int main() {memset(c,0,sizeof(c));memset(w,0,sizeof(w));int n,k,arrive,process,vip;cin>>n;for (int i=0;i<n;i++){cin>>arrive>>process>>vip;if (process>60) process=60;c[i].arrive=arrive;c[i].process=process;c[i].vip=vip;}int v;cin>>k>>v;for (int i=0;i<k;i++) w[i].availiable=1;int count=0;int m;for (m=0;;m++){if (count==n) break;for (int i=0;i<k;i++) //窗口刷新 {if (w[i].end==m){w[i].availiable=1;}}if (w[v].availiable==1) //vip窗口拉人 {for (int i=0;c[i].arrive<=m&&i<n;i++){if (c[i].skip==1) continue;if (c[i].vip==1){c[i].skip=1;c[i].start=m;c[i].end=c[i].start+c[i].process;c[i].wait=c[i].start-c[i].arrive;w[v].availiable=0;w[v].end=m+c[i].process;count++;w[v].count++;break;}}}for (int i=0;i<k;i++){if (w[i].availiable==1){for (int j=0;j<n&&c[j].arrive<=m;j++){if (c[j].skip==1) continue;c[j].start=m;c[j].end=c[j].start+c[j].process;c[j].skip=1;c[j].wait=c[j].start-c[j].arrive;w[i].availiable=0;w[i].count++;w[i].end=m+c[j].process;count++;break;}}}}double sum=0;int maxwait=-1,last=-1;for (int i=0;i<n;i++){sum+=c[i].wait;if (c[i].wait>maxwait){maxwait=c[i].wait;}if (c[i].end>last){last=c[i].end;} // printf("*%.1lf %.1lf %.1lf\n",c[i].start,c[i].process,c[i].end);}printf("%.1lf %d %d\n",sum/n,maxwait,last);printf("%d",w[0].count);for (int i=1;i<k;i++){printf(" %d",w[i].count);}return 0; }總結
以上是生活随笔為你收集整理的7-4 银行排队问题之单队列多窗口加VIP服务 (30 分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Leetcode--94. 二叉树的中序
- 下一篇: 程序架构--BS,CS