1. 程式人生 > >1017 Queueing at Bank

1017 Queueing at Bank

tar 客戶 題意 continue 參與 custom div using 窗口

題意:銀行有K個窗口用於服務,給出所有人的達到時間T和服務時間P,計算所有被服務的客戶的平均等待時間。任何客戶的服務時間不得超過60分鐘。早於08:00到的,要等到08:00;在17:00:01及之後到的,不給予服務,不參與計算平均等待時間。

思路:首先,對所有顧客的到達時間進行排序;其次,令數組windows[i]表示窗口i當前顧客的結束服務的時間,初始化為08:00,這樣的話,每次要安排下一個顧客前往某窗口接受服務時,就遍歷所有窗口,找出當前最快結束的那個窗口(記為minidx),然後讓這位顧客去minidx號窗口接受服務。顧客的等待時間分為兩種情況:1)若顧客到達的時間比較早,早於當前窗口的最早結束的時間,如當前窗口結束前一個人的服務時間是08:16,但是下一位顧客08:01(其服務時間是60分鐘)就到了,則該顧客需等待15分鐘,而該窗口的最早結束服務的時間就更新為08:16+60min;2)若顧客到達的時間比較晚,晚於當前窗口的最早結束的時間,如當前窗口結束前一個人的服務時間是08:16,但是下一位顧客08:20(其服務時間是60分鐘)才到,則該顧客無需等待,相應的,該窗口的最早結束服務的時間就更新為08:20+60min,註意區別,這種情況下,時間更新為該顧客的到達時間+其服務時長!

一些註意點:

1.為了時間比較的方便,統一化成以秒為單位;

2.因為任何客戶的服務時間不得超過60分鐘,故在數據輸入時就先做好判斷,如果某個顧客服務時間超過60分鐘的,直接截斷成60分鐘;

3.因為在17:00:01及之後到的,不給予服務,不參與計算平均等待時間,即無效數據,故在數據輸入時就先剔除;

我的主要問題出在了更新狀態未考慮周全,即上面所說的情況(2)。

代碼:

#include <cstdio>
#include <algorithm>
using namespace std;
const int START_TIME=8*3600;
const int END_TIME=17
*3600; //時間均以秒為單位 struct Customer{ int arrivedTime; int servedTime; }cus[10005]; int totalWait=0;//總的等待時間 int windows[105];//表示窗口i的最早結束服務的時間,初始化為START_TIME bool cmp(Customer a,Customer b){ return a.arrivedTime<b.arrivedTime; } int main() { //freopen("pat.txt","r",stdin); fill(windows,windows+105
,START_TIME);//初始化 int n,k,validCnt=0; scanf("%d%d",&n,&k); int hh,mm,ss,serve; for(int i=0;i<n;i++){ scanf("%d:%d:%d%d",&hh,&mm,&ss,&serve); if(hh*3600+mm*60+ss>END_TIME) continue;//如果到達時間超過下班時間,則無效 cus[validCnt].arrivedTime=hh*3600+mm*60+ss; cus[validCnt++].servedTime=(serve>60?60:serve)*60; } sort(cus,cus+validCnt,cmp); int idx=0; while(idx<validCnt){ //遍歷所有窗口,尋找當前哪個窗口最先有空 int minidx=-1,minTime=0x7fffffff; for(int i=0;i<k;i++){ if(windows[i]<minTime){ minTime=windows[i]; minidx=i; } }
     //更新
if(windows[minidx]>cus[idx].arrivedTime){ totalWait+=windows[minidx]-cus[idx].arrivedTime; windows[minidx]+=cus[idx].servedTime; }else{ windows[minidx]=cus[idx].arrivedTime+cus[idx].servedTime;//關鍵,容易忽略 } idx++; } printf("%.1f",totalWait/60.0/validCnt); return 0; }

1017 Queueing at Bank