寫在前面
- 思路分析
- n個客戶, k個視窗
- 已知每個客戶到達時間和需要時長,如果有視窗就依次過去,沒有視窗就在黃線外等候。求客戶平均等待時長
- 黃線外隻有1個隊伍,先來先服務
- 銀行開放時間為8點到17點,8點之前不開門, 8點之前來的人要等待,在17點後來的人不被服務。
- 已知每個客戶到達時間和需要時長,如果有視窗就依次過去,沒有視窗就在黃線外等候。求客戶平均等待時長
- 實作分析:
- 客戶結構體node,到達時間、需要服務時長
- 先将所有滿足條件的(到來時間點在17點之前)客戶放入數組,數組長度就是需要服務的客戶個數
- window數組表示某個視窗的結束時間
- 客戶到,有空閑視窗,等待時間為0,重新整理視窗結束時間
- 客戶到,無空閑視窗,循環比較等待時間最小的一個,重新整理視窗結束時間
- 開始所有視窗值都為8點整。對所有客戶先進行排序,按來的時間早晚排序,之後再先來先服務
- 時間暫時化解成秒數,便于計算
- 如果1個可以被服務的客戶都沒有,輸出0.0
- 客戶結構體node,到達時間、需要服務時長
- n個客戶, k個視窗
- 題目基礎,細節處理耗費時間
- 學習ing
測試用例
-
input: 7 3 07:55:00 16 17:00:01 2 07:59:59 15 08:01:00 60 08:00:00 30 08:00:02 2 08:03:00 10 output: 8.2
ac代碼
-
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct node { int come, time; } tmpcustomer; bool cmp1(node a, node b) { return a.come < b.come; } int main() { int n, k; scanf("%d%d", &n, &k); vector<node> custom; for(int i = 0; i < n; i++) { int hh, mm, ss, time; scanf("%d:%d:%d %d", &hh, &mm, &ss, &time); int cometime = hh * 3600 + mm * 60 + ss; // 17點後 if(cometime > 61200) continue; tmpcustomer = {cometime, time * 60}; custom.push_back(tmpcustomer); } sort(custom.begin(), custom.end(), cmp1); // 初始化為早8點 vector<int> window(k, 28800); double result = 0.0; for(int i = 0; i < custom.size(); i++) { int tmpInx = 0, minfinish = window[0]; // window數組表示某個視窗的結束時間,每1個客戶到來的時候,選擇最早結束時間的視窗 for(int j = 1; j < k; j++) { if(minfinish > window[j]) { minfinish = window[j]; tmpInx = j; } } // 如果最早結束時間比他晚,累加等待的時間,更新window的值 if(window[tmpInx] <= custom[i].come) window[tmpInx] = custom[i].come + custom[i].time; else { result += (window[tmpInx] - custom[i].come); window[tmpInx] += custom[i].time; } } if(custom.size() == 0) printf("0.0"); else printf("%.1f", result / 60.0 / custom.size()); return 0; }