銀行排隊問題之單隊列多窗口加VIP服務(30 分)


銀行排隊問題之單隊列多窗口加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到K1)。這里假設每位顧客事務被處理的最長時間為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<stdio.h>
#include<stdlib.h>
typedef struct node
{
    int t, p;//到達時間,處理時間
}ST;
ST q[1005];//數組模擬隊列
int main()
{
    int l, r, n, k, i;
    while(~scanf("%d", &n))
    {
        l = r = 0;//隊列頭和尾
        for(i = 0; i < n; i++)
        {
            scanf("%d %d", &q[r].t, &q[r].p);//將輸入的數入隊列
            if(q[r].p > 60) q[r].p = 60;//根據題目要求,最大處理時間60
            r++;
        }
        scanf("%d", &k);//k個窗口
        int sumwait = 0, lenwait = 0, wait = 0;//總的等待時間, 最長的等待時間, 單次等待時間
        int sum[15] = {0}, winnum[15] = {0};//完成時間,窗口人數
        while(l < r)
        {
            int flag = 0, minn = 0x3f3f3f3f, imin = 0;//標記變量, 最快的完成時間, 最快完成時間的下標
            for(i = 0; i < k; i++)//遍歷k個窗口
            {
                if(sum[i] < q[l].t)//如果隊列首位,到達時間比,完成時間大,就代表不需要等待
                {
                    sum[i] = q[l].t + q[l].p;//更新完成這個窗口完成的時間
                    winnum[i]++;//窗口人數加一
                    flag = 1;//標記一下,代表不需要等待
                    l++;//隊列首位除去
                    break;//退出循環
                }
                if(minn > sum[i])//如果需要等待,就記錄各個窗口里最快完成的那個窗口的完成時間,和下標
                {
                    minn = sum[i];
                    imin = i;
                }
            }
            if(!flag)//需要等待
            {
                wait = minn - q[l].t;//等待的時間,最快完成的時間減去隊列第一個人到達的時間
                if(lenwait < wait) lenwait = wait;//不斷更新等待的最長時間
                sumwait += wait;//求等待時間的和
                sum[imin] = minn + q[l].p;//更新對應窗口的完成時間
                winnum[imin]++;//對應窗口人數++
                l++;//隊列刪除首位
            }
        }
        int last = 0;
        for(i = 0; i < k; i++)
        {
            if(last < sum[i]) last = sum[i];//求最大完成時間
        }
        printf("%.1lf %d %d\n", 1.0 * sumwait / n, lenwait, last);//輸出,平均等待時間, 最長等待時間, 最后完成時間
        for(i = 0; i < k; i++)
        {
            printf("%d", winnum[i]);//輸出各個窗口的人數
            if(i == k - 1) printf("\n");
            else printf(" ");
        }
    }
    return 0;
}

 

 


免責聲明!

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



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