PAT甲題題解-1014. Waiting in Line (30)-模擬,優先級隊列


題意:n個窗口,每個窗口可以排m人。有k為顧客需要辦理業務,給出了每個客戶的辦理業務時間。
銀行在8點開始服務,如果窗口都排滿了,客戶就得在黃線外等候。如果有一個窗口用戶服務結束,
黃線外的客戶就進來一個。如果有多個可選,選窗口id最小的。
輸出查詢客戶的服務結束時間。

如果客戶在17點(注意是包括的!!!就在這里被坑了,一開始還以為不包括。。。)或者以后還沒開始服務,就輸出Sorry
如果已經開始了,無論多長都會繼續服務的。

思路:
建立一個優先級隊列,存儲在黃線之內的所有客戶。
對於m*n之前的人,依此往窗口里排隊(即優先級隊列里)即可。
對於之后的人,從優先級隊列里取出結束時間最少的客戶,有相同的話則是窗口最小的,
進入他所在的隊列。
同時還要建立linetime數組,存儲每個窗口排在末尾客戶的結束時間。
當窗口j新加進來一個客戶,他的起始時間則是linetime[j],結束時間則是linetime[j]+服務時間,同時更新linetime[j]

最后對於查詢的客戶,如果起始時間>=17:00,則輸出Sorry
否則輸出對應的結束時間即可,這里方便起見,以分數存儲的,所以最后還要轉化一下。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
const int maxn=1000+5;
int n,m,k,q;
struct Customer{
    int line;
    int start_time=0;
    int end_time=0;
    int process_time;
    bool operator<(const Customer tmp)const{
        /*
        取隊列中最早結束的,如果時間一樣,取窗口id最小的
        */
        if(end_time==tmp.end_time)
            return line>tmp.line;
        else
            return end_time>tmp.end_time;
    }
}cus[maxn];
int query[maxn];
int finish_time[maxn];
int main()
{
    scanf("%d %d %d %d",&n,&m,&k,&q);
    for(int i=1;i<=k;i++){
        scanf("%d",&cus[i].process_time);
    }
    for(int i=1;i<=q;i++){
        scanf("%d",&query[i]);
    }
    priority_queue<Customer>queueline;
    int cnt=0;
    Customer tmp;
    int linetime[maxn];
    memset(linetime,0,sizeof(linetime));
    //對於前m*n個人,往隊列里插即可
    for(int i=1;i<=m && cnt<k;i++){
        for(int j=0;j<n && cnt<k;j++){
            cnt++;
            tmp.line=j;
            tmp.start_time=linetime[j];
            tmp.end_time=linetime[j]=tmp.start_time+cus[cnt].process_time;
            cus[cnt].line=j;
            cus[cnt].start_time=tmp.start_time;
            cus[cnt].end_time=tmp.end_time;
            queueline.push(tmp);
        }
    }
    Customer c;
    for(int i=cnt+1;i<=k;i++){
        //取出結束時間最早的
        tmp=queueline.top();
        queueline.pop();
        c.line=tmp.line;
        c.start_time=linetime[tmp.line];
        c.end_time=linetime[tmp.line]=c.start_time+cus[i].process_time;
        cus[i].line=c.line;
        cus[i].start_time=c.start_time;
        cus[i].end_time=c.end_time;
        queueline.push(c);
    }
    int cid;
    int maxtime=(17-8)*60;
    for(int i=1;i<=q;i++){
        cid=query[i];
        ///原來開始的時間包括17:00。。。只要是17:00或者是以后的,就不被服務
        ///原來寫的是>,結果一部分樣例一直沒過,還以為自己前面寫錯了
        if(cus[cid].start_time>=maxtime)
            printf("Sorry\n");
        else{
            int hour=cus[cid].end_time/60;
            int minu=cus[cid].end_time%60;
            printf("%02d:%02d\n",hour+8,minu);
        }
    }
    return 0;
}
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM