題目描述
假設銀行有K個窗口提供服務,窗口前設一條黃線,所有顧客按到達時間在黃線后排成一條長龍。當有窗口空閑時,下一位顧客即去該窗口處理事務。當有多個窗口可選擇時,假設顧客總是選擇編號最小的窗口。
本題要求輸出前來等待服務的N位顧客的平均等待時間、最長等待時間、最后完成時間。
輸入
輸入第1行給出正整數N(≤),為顧客總人數;隨后N行,每行給出一位顧客的到達時間T
和事務處理時間P
,並且假設輸入數據已經按到達時間先后排好了順序;最后一行給出正整數K(≤),為開設的營業窗口數。
輸出
在一行中輸出平均等待時間(輸出到小數點后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 62
提示
#include<iostream> #include<queue> #include<iomanip> using namespace std; int queindex(int total,queue<int>Q) { int index=0; queue<int>temp=Q; while(!temp.empty()) { temp.pop(); index++; } return total-index+1; } int main() { int virclock=0; double averagewait=0; int maxwait=0; int alreadytime=0; queue<int>arrivetime;///客戶到的時間 queue<int>solvetime;///辦業務的時間 int T; cin>>T; int timewait[T];///各個客戶等待的時間,各項初始化為0 for(int i=0;i<T;i++) timewait[i]=0; for(int i=0;i<T;i++) { int n,t; cin>>n>>t; arrivetime.push(n); solvetime.push(t); } int K; cin>>K; queue<int>bank[K]; int done=0; while(done==0) { for(int i=0;i<K;i++) { if(bank[i].empty())///銀行有空位 { if(!arrivetime.empty()&&arrivetime.front()<=virclock)///有人到銀行 { bank[i].push(solvetime.front()); arrivetime.pop(); solvetime.pop(); } } } int bankemp=0;///銀行還有幾個空位,當空位為0時判斷一下是否還有人在等待 for(int i=0;i<K;i++) if(bank[i].empty()) bankemp++; if(bankemp==0) { queue<int>temp=arrivetime; while(!temp.empty()&&temp.front()<=virclock)///如果有人等,找他是第幾個客戶,數組等待時間加 { int number=queindex(T,temp); timewait[number-1]+=1; temp.pop(); } } for(int i=0;i<K;i++)///該分鍾的處理 { if(!bank[i].empty()) { int temp=bank[i].front()-1; bank[i].pop(); bank[i].push(temp); if(bank[i].front()==0) { bank[i].pop(); } } } int emp=1;///判斷是否完全結束 for(int i=0;i<K;i++) { if(!bank[i].empty()) { emp=0; break; } } if(emp==1&&arrivetime.empty()&&solvetime.empty()) done=1; virclock++;///進入下一分鍾 } for(int i=0;i<T;i++)///分別計算平均等待時間與最大等待時間 { if(maxwait<timewait[i]) maxwait=timewait[i]; averagewait+=timewait[i]; } averagewait/=T; alreadytime=virclock; cout<<fixed<<setprecision(1)<<averagewait<<" "; cout<<maxwait<<" "; cout<<alreadytime<<endl; return 0; }