PAT甲級1017題解 模擬排序

2022-06-06 03:54:07 字數 1351 閱讀 8774

題目分析:

本題我第一次嘗試去做的時候用的是優先佇列,但是效率不僅**量很大,而且還有測試樣例過不去,很顯然沒有找到乙個好的資料結構來解決這道題目(隨著逐漸的刷pat甲級的題會發現有時選擇乙個好的解題方向真的比一些花裡胡哨的技巧重要的多),對於本題,我們需要模擬的是乙個去銀行接受服務的過程,銀行有k個視窗,而在8點開門之前所有到達的人都在門外排隊(在8點後到達的人如果有人則需要排隊,視窗中有空位則會選擇最空閒的進行自己的服務),首先我們需要對n個使用者按照到達的時間進行排序,然後建立乙個window陣列存放每個視窗結束被占用的的時間(最初始k個視窗都為28800,這是8點轉化成了秒為單位,本題所有的時間都轉化成了秒,方便計算,而上限值則是17點相對的秒數61200秒,使用者在17點之後到達則無法接受服務且不會被加入有效等待人數中),對於使用者佇列,我們每次選擇乙個人,這個人將選擇此時k個視窗中時間最小的,模擬使用者接受服務的過程,而這個過程分為兩種情況(1.輪到這個使用者的時候,最小的視窗時間比使用者到達的時間小,則表示在使用者到達之前這個視窗已經空出來了,且沒有人占用它,則這個使用者的等待時間則為0,此時更新這個視窗的時間為該使用者達到時間+該使用者需要服務的時間 2.輪到這個使用者的時候,最小的視窗時間比使用者到達的時間大,則表示使用者在到達的時候最近的乙個視窗還正在被占用,則使用者就需要等待的時間為:這個視窗的結束占用時間-使用者到達的時間,然後這個使用者接受服務,則也需要更新這個視窗的結束被占用時間為此時視窗時間+使用者需要服務的時間)對於輸入n為0的情況特判一下

1 #include2 #include3 #include4 #include5

using

namespace

std;67

struct

node;

1011

bool

cmp(node a, node b)

1415

intmain()

27sort(cus.begin(), cus.end(), cmp);

28int wait_sum = 0; //

總等待時間

29 vector window(k, 28800); //

對k個視窗初始化時間為8點 == 28800秒

30for(int i = 0; i < cus.size(); i++)

38}

39if(window[index] <=cus[i].come)else

45//

cout<<"wait_sum"<46

} 47

if(cus.size() == 0) printf("

0.0\n");

48else

51}

52return0;

53 }

浙大PAT甲級 1017

銀行佇列 卻沒用到佇列 include include include include include include using namespace std int n,k vectorline struct customer bool compare customer c1,customer c...

PAT甲級1017解法

這題也出現了時間,我們根據上一題的經驗同樣把時分秒轉換為自零點零分零秒開始經過的秒數。這題也出現了視窗排隊,之前也有題目可以參考,而且這次每個視窗最多排乙個,更加簡單。另外,之前用過的sort排序這裡也有用處。本來我的想法是先填滿所有視窗,將沒排進視窗的統一放在乙個佇列中儲存,但這個方法比較複雜,而...

PAT甲級題解目錄

寫在前面 9月8號剛參加了第一次pat甲級考試,成績還算是滿意。但是沒有滿分,算是有一點小遺憾,於是打算12月再來一次,但是這次採用佛系備考與吃老本的複習方法 畢竟初試重要啊 為了記錄一下成長歷程和各題要點,順便做乙個部落格題解,也給有需要的戰友們提供乙個參考吧。本部落格純屬個人記錄與經驗分享,不帶...