如1014, 1017, 1026, 如下給出1017題目c++
如1006, 1016, 1095,如下給出1016題目windows
如何處理輸入的數據?數據結構
對於時間輸入格式的處理code
MM:dd:HH:mm
,因此能夠採用格式化輸入的形式讀取int month, day, hour, min; scanf("%d:%d:%d:%d", &month, &day, &hour, &min);
通常講全部的時間轉化爲讀入的最小時間單元,用一個變量保存。在這個例子中,將月、日、小時都轉化爲分鐘的形式。blog
int time = month*31*24*60+day*24*60+hour*60+min;
建立數據結構保存數據排序
對於類型一的題目須要建立customer
以及window
兩個結構體隊列
customer
結構中,根據題目要求,通常須要保存顧客到達時間,顧客所需服務時長,顧客開始接受服務的時間等。string
struct customer{ int arrive; int processTime; int start; };
window
結構中,根據題目要求,通常須要保存窗口服務完一個客戶後的結束時間,窗口當前服務人數等。it
struct window{ int lastAvailableTime; int count; };
對於類型二的題目通常須要建立info
結構體以及一個map
用來保存顧客ID與info
的關係table
info
結構體用來保存顧客開啓/結束服務的時間以及該時間是開啓仍是結束服務;
struct info{ int time; bool isStart; }
map 結構
map<string, vector<struct info> > customerInfo;
如何模擬排隊/隊列?
對於類型一的題目
根據顧客到達的時間前後對全部顧客進行排序
bool cmp(struct customer a, struct customer b){ return a.arrive<b.arrive; } sort(customers.begin(),customers.end(),cmp);
找到當前最先空閒的窗口
int index = -1; int minEnd = inf; for(int j =0;j<windows.size();j++){ if(windows[j].lastAvailableTime<minEnd){ minEnd = windows[j].lastAvailableTime; index = j; } }
選擇該窗口爲當前最先到達且還未服務的顧客服務
若是該窗口空閒的時間比顧客到達的時間早
顧客不須要等待
窗口下一個空閒時間爲顧客到達時間+顧客所須要的服務時間
若是該窗口空閒的時間比顧客到達的時間晚
顧客需等待
窗口下一個空閒時間爲窗口空閒時間+顧客所須要的服務時間
if(windows[index].lastAvailableTime>customers[i].arrive){ totalWait += windows[index].lastAvailableTime-customers[i].arrive; windows[index].lastAvailableTime += customers[i].process; } else{ windows[index].lastAvailableTime = customers[i].process+customers[i].arrive; }
對於類型二的題目
根據題意篩選有效信息,去掉只有開啓服務沒有結束服務或只有結束服務沒有開啓服務的信息。
這裏須要針對每個顧客的信息按照時間進行排序,選擇對應的開啓和結束服務時間
for(map<string, vector<struct info> >::iterator it = customers.begin();it!=customers.end();it++){ vector<struct info> vec = it->second; sort(vec.begin(),vec.end(),cmp); for(int i = 0;i<vec.size()-1;i++){ if(vec[i].isOn && vec[i+1].isOn) continue; else if(!vec[i].isOn) continue; else if(vec[i].isOn && !vec[i+1].isOn){ /*------to fill-----------*/ /*------根據題意添加--------*/ i++; } } }
根據篩選出來的信息,按照題意計算。
題號 (按難度排序) | 題目難點(各題的不一樣) | 注意事項 |
---|---|---|
1017(25) | 給出窗口數和顧客到達及服務時間 | 晚與17:00到達的顧客 不接受服務也不計入等待時間 |
求全部顧客的平均等待時間 | 注意沒有符合要求的顧客時, 須要單獨討論輸出0.0 |
|
1014(30) | 給出窗口數和顧客到達及服務時間 | 若當前最快的顧客結束時間已達17:00, 把當前全部窗口正在進行的服務處理完即結束 |
窗口有必定量的排隊等待數量 | 須要改變window的結構體struct window{ queue<int> customerID; int lastAvailable = 8*60;}; |
|
求每一個顧客離開的時間 | ||
1026(30) | 給出窗口數和顧客到達及服務時間 | 21:00:00時再也不接受顧客 |
規定了VIP窗口和VIP客戶, VIP客戶能夠優先使用VIP窗口 |
VIP客戶優先使用空閒VIP窗口即便有普通窗口空閒 | |
求顧客開始接受服務和等待服務的時間 |
題號(按難度排序) | 題目難點(各題的不一樣) | 注意事項 |
---|---|---|
1006(25) | 求最早開啓服務的顧客 以及最晚結束服務的顧客 |
無 |
1016(25) | 不一樣時間段提供服務的收費價格不一樣 | 可能有跨天電話 |
求每一個顧客每一次服務的花費以及總花費 | ||
1095(30) | 求總服務時間最長的顧客 | |
求在指定時間開啓該項服務的顧客數 |