題意: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; }
