日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1017 Queueing at Bank:[C++题解]字符串、结构体、最小堆

發布時間:2025/4/5 c/c++ 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++题解]字符串、结构体、最小堆的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。