PAT (Advanced Level) 1014 Waiting in Line(模拟)
生活随笔
收集整理的這篇文章主要介紹了
PAT (Advanced Level) 1014 Waiting in Line(模拟)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目鏈接:點擊查看
題目大意:給出規(guī)則,要求模擬客戶到銀行辦理手續(xù)的過程:為了方便描述,下面將分為等待區(qū)和服務(wù)區(qū)來稱呼
給出上述銀行的運行規(guī)則,現(xiàn)在我們會有q個詢問,每次詢問都是客戶的編號,請輸出客戶完成手續(xù)后的離開時間,若無法進行服務(wù),輸出sorry
題目分析:這個題目可以歸為中等難度的模擬題吧,不過我還有點喜歡這種看似繁瑣,實際寫起來很爽的模擬題,一開始是沒有什么簡單思路的,稍微想了一會,我發(fā)現(xiàn)可以從枚舉分鐘入手,因為畢竟銀行就只上班九個小時,9*60=540的時間復(fù)雜度都可以忽略不計了。。這樣一想這個題目就瞬間沒有難度了,再配合上雙端隊列deque的輔助操作,就能輕輕松松完成這個題目了
有個小坑點,就是當(dāng)客戶在銀行下班之前排上隊了,但是在銀行下班的時候卻沒有及時完成業(yè)務(wù),此時這個客戶是可以繼續(xù)完成業(yè)務(wù)后再離開的,而不是輸出sorry,這里記得特判一下,一開始沒想到這里,WA了一半的樣例。。
直接上代碼吧,stl大法好:
#include<iostream> #include<cstdlib> #include<string> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #include<cmath> #include<cctype> #include<stack> #include<queue> #include<list> #include<vector> #include<set> #include<map> #include<sstream> #include<deque> using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e3+100;struct Node {int id;int remain;Node(int ID,int RE){id=ID;remain=RE;} };//儲存用戶信息:編號和剩余時間int ans[N];//記錄每個人的最終離開時間,-1代表沒能服務(wù)deque<Node>win[25];//模擬每個窗口 bool check()//檢查是否所有窗口都沒人了 {for(int i=0;i<25;i++)if(win[i].size())return false;return true; } int main() { // freopen("input.txt","r",stdin);int n,m,c,w;scanf("%d%d%d%d",&n,&m,&c,&w);queue<Node>q;for(int i=1;i<=c;i++){int time;scanf("%d",&time);q.push(Node(i,time));}for(int i=1;i<=m;i++)//每列m個人 {for(int j=1;j<=n;j++)//n個窗口{if(!q.empty())//如果還有人在排隊,依次放進服務(wù)區(qū) {win[j].push_back(q.front());q.pop();}}}for(int time=1;time<=9*60;time++)//枚舉時間{if(check()&&q.empty())//服務(wù)區(qū)和等待區(qū)都沒人了 break;for(int i=1;i<=n;i++)//遍歷每個窗口{if(win[i].empty())//如果該窗口沒人了,跳過continue;Node cur=win[i].front();//取出第一個人 win[i].pop_front();cur.remain--;//過去一分鐘了if(!cur.remain&&time!=9*60)//該用戶的業(yè)務(wù)結(jié)束,最后一分鐘需要特判 {ans[cur.id]=time;if(!q.empty())//如果等待區(qū)還有人 {win[i].push_back(q.front());//直接排在后面 q.pop();} } else//沒結(jié)束或最后一分鐘結(jié)束的話再放回原位{win[i].push_front(cur);}} }//下班了 for(int i=1;i<=n;i++)//服務(wù)區(qū)的人 {if(!win[i].empty())//當(dāng)前的人說明還在服務(wù),需要服務(wù)完才能離開{Node cur=win[i].front();win[i].pop_front();ans[cur.id]=9*60+cur.remain;}while(!win[i].empty())//其余的人都不能接受服務(wù)了{Node cur=win[i].front();win[i].pop_front();ans[cur.id]=-1;}}while(!q.empty())//等待區(qū)的人 {Node cur=q.front();q.pop();ans[cur.id]=-1;}while(w--){int x;scanf("%d",&x);if(ans[x]==-1)printf("Sorry\n");elseprintf("%02d:%02d\n",ans[x]/60+8,ans[x]%60);} return 0; }?
總結(jié)
以上是生活随笔為你收集整理的PAT (Advanced Level) 1014 Waiting in Line(模拟)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ - 1358 Housing C
- 下一篇: PAT (Advanced Level)