DS隊列----銀行單隊列多窗口模擬


題目描述

假設銀行有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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM