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