SDUTOJ(2087)離散事件模擬-銀行管理

離散事件模擬-銀行管理

Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description

 

現在銀行已經很普遍,每個人總會去銀行辦理業務,一個好的銀行是要考慮 平均逗留時間的,即: 在一定時間段內所有辦理業務的人員逗留的時間的和/ 總的人數。逗留時間定義爲 人員離開的時間減去人員來的時間。銀行只有考慮了這一點,我們在辦理業務的時候,纔不會等太多的時間。

爲了簡化問題,我們認爲銀行只有一號窗口和二號窗口可以辦理業務 ,並且在時間範圍是12<=time<=18,即從中午十二點到晚上十八點,輸入數據採用分鐘即0代表中午12點,60代表下午一點,90代表下午一點半… 這樣time>=0&&time<=360, 如果來的時間超出這個時間段不接受(辦理時間不受限制)。每個人到達的時間都不一樣。顧客到達的時候,總是前往人數少的那個窗口。如果人數相當或者兩個窗口都沒有人總是前往1號窗口。請計算平均逗留時間=總逗留的分鐘數/總的人數。

Input

 

第一行一個整數t(0 < t <= 100), 代表輸入的組數。

對於每一組輸入一個整數n (0 < n <= 100),代表有n個人。然後是n行,每行有兩個數據 x 與 y。 x代表顧客到達時間,y代表辦理業務需要的時間。x, y 爲整數(0 <= x <= 360)(y > 0 && y <= 15)。數據保證按顧客來的先後順序輸入。

Output

 

對於每組數據輸出平均逗留時間,保留兩位小數。

Sample Input

1
1
60 10

Sample Output

10.00

Hint

Source

 GYX 

解題思路:其實一開始拿到這個題還沒啥思路,湊巧去銀行排了個隊,排隊的時候一直在考慮銀行叫號的隊列是怎麼寫的。後來發現其實沒有那麼複雜,我們現在如果有一個客戶叫了一個號,我們先判斷一下兩個隊列的情況,按照題目要求,我們可以求出他應該去哪個隊列,實時更新隊列的相關信息(長度,最後一個客戶離開的時間),注意維護隊列的長度。


AC代碼:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

typedef struct node ///數組模擬隊列
{
    int date[300];
    int fro;
    int rea;
    int len;
}Queue;

void Init_Queue(Queue *q) ///初始化
{
    q->fro = 0;
    q->rea = 0;
    q->len = 0;
}

int isEmpty(Queue *q) ///判空
{
    if(q->len == 0)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int main()
{
    int t;
    int n,x,y,l1,l2,p;
    double sum;
    scanf("%d",&t);
    while(t--)
    {
        Queue q1,q2;
        sum=0;
        l1=l2=0;
        Init_Queue(&q1);
        Init_Queue(&q2);
        scanf("%d",&n);

        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&x,&y);

            while(!isEmpty(&q1) && q1.date[q1.fro]<=x)
                {
                    q1.fro++;
                    q1.len--;
                }
            while(!isEmpty(&q2) && q2.date[q2.fro]<=x)
                {
                    q2.fro++;
                    q2.len--;
                }
            if(q1.len<=q2.len)
            {
                if(x<l1)
                    p=l1+y;
                else
                    p=x+y;

                l1=p;
                sum=sum+(p-x);
                q1.date[q1.rea++] = p;
                q1.len++;
            }

            else
           {
                 if(x<l2)
                    p=l2+y;
                else
                    p=x+y;

                l2=p;
                sum=sum+(p-x);
                q2.date[q2.rea++] = p;
                q2.len++;
            }

        }

        printf("%.2lf\n",sum/n);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章