PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
客戶數據用什么存呢?
好吧,還是用結構體。
結構體里面存什么呢?
到達時間 和服務時間。
窗口怎么存呢?
將窗口的開始服務時間從小到大存,自然想到小根堆。
priority_queue<int, vector<int> , greater<int> > windows;對于每個顧客:
1.找時間最早的窗口
2.將該人安排到該窗口 :累加等待時間(開始服務的時間 - 到達的時間),當前窗口新的結束時間是什么呢? 自己的結束時間+ 要服務顧客的服務時間,這里即為更新窗口.
ac代碼
#include<bits/stdc++.h> using namespace std;const int N =1e4+10; int n,k; // k表示窗口數量//等待時間 = 結束時間 - 到來的時間struct Person{int arriveTime;int serveTime;bool operator<(const Person& a)const{return arriveTime<a.arriveTime;} }person[N]; //結構體數組int main(){cin>>n>>k;double res = 0;int hour,minute,second, serveTime; //讀入所有客戶for(int i=0;i<n;i++){scanf("%d:%d:%d %d",&hour,&minute, &second, & serveTime);serveTime = min(serveTime , 60);person[i] = {hour * 3600 + minute * 60 + second , serveTime* 60}; //時間統一成秒}priority_queue<int ,vector<int> ,greater<int>> windows; // 小根堆//預處理窗口:存窗口的開始時間for(int i=0;i<k;i++) windows.push(8*3600); //窗口開始服務時間,從8點鐘開始服務, 轉換成秒//按到達時間從早到晚排序sort(person, person+n);int sum=0 , cnt =0;for(int i =0 ;i< n; i++){auto p = person[i];//取出最早空閑的窗口int w =windows.top();windows.pop();if(p.arriveTime > 17*3600) break; //誰來晚了,忽略之。//某位顧客開始業務的時間:來早了沒有空閑窗口,開始時間是窗口空閑時間;來晚了但有窗口空閑,開始時間是到達時間//即兩者取最大值int startTime = max(p.arriveTime , w); //兩種情況:有空閑窗口或者窗口有人sum+= startTime - p.arriveTime; //累加等待時間cnt ++; //可以被服務的人數windows.push(startTime +p.serveTime); //更新窗口:服務完一個客戶后開始的時間}printf("%.1lf\n",(double)sum/cnt/60);}題目鏈接
PAT甲級1017 Queueing at Bank
總結
以上是生活随笔為你收集整理的PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1016 Phone Bill
- 下一篇: PAT甲级1002 A+B for Po