PAT (Advanced Level) 1014 Waiting in Line(模拟)
題目鏈接:點(diǎn)擊查看
題目大意:給出規(guī)則,要求模擬客戶到銀行辦理手續(xù)的過(guò)程:為了方便描述,下面將分為等待區(qū)和服務(wù)區(qū)來(lái)稱呼
給出上述銀行的運(yùn)行規(guī)則,現(xiàn)在我們會(huì)有q個(gè)詢問(wèn),每次詢問(wèn)都是客戶的編號(hào),請(qǐng)輸出客戶完成手續(xù)后的離開(kāi)時(shí)間,若無(wú)法進(jìn)行服務(wù),輸出sorry
題目分析:這個(gè)題目可以歸為中等難度的模擬題吧,不過(guò)我還有點(diǎn)喜歡這種看似繁瑣,實(shí)際寫起來(lái)很爽的模擬題,一開(kāi)始是沒(méi)有什么簡(jiǎn)單思路的,稍微想了一會(huì),我發(fā)現(xiàn)可以從枚舉分鐘入手,因?yàn)楫吘广y行就只上班九個(gè)小時(shí),9*60=540的時(shí)間復(fù)雜度都可以忽略不計(jì)了。。這樣一想這個(gè)題目就瞬間沒(méi)有難度了,再配合上雙端隊(duì)列deque的輔助操作,就能輕輕松松完成這個(gè)題目了
有個(gè)小坑點(diǎn),就是當(dāng)客戶在銀行下班之前排上隊(duì)了,但是在銀行下班的時(shí)候卻沒(méi)有及時(shí)完成業(yè)務(wù),此時(shí)這個(gè)客戶是可以繼續(xù)完成業(yè)務(wù)后再離開(kāi)的,而不是輸出sorry,這里記得特判一下,一開(kāi)始沒(méi)想到這里,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;} };//儲(chǔ)存用戶信息:編號(hào)和剩余時(shí)間int ans[N];//記錄每個(gè)人的最終離開(kāi)時(shí)間,-1代表沒(méi)能服務(wù)deque<Node>win[25];//模擬每個(gè)窗口 bool check()//檢查是否所有窗口都沒(méi)人了 {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個(gè)人 {for(int j=1;j<=n;j++)//n個(gè)窗口{if(!q.empty())//如果還有人在排隊(duì),依次放進(jìn)服務(wù)區(qū) {win[j].push_back(q.front());q.pop();}}}for(int time=1;time<=9*60;time++)//枚舉時(shí)間{if(check()&&q.empty())//服務(wù)區(qū)和等待區(qū)都沒(méi)人了 break;for(int i=1;i<=n;i++)//遍歷每個(gè)窗口{if(win[i].empty())//如果該窗口沒(méi)人了,跳過(guò)continue;Node cur=win[i].front();//取出第一個(gè)人 win[i].pop_front();cur.remain--;//過(guò)去一分鐘了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//沒(méi)結(jié)束或最后一分鐘結(jié)束的話再放回原位{win[i].push_front(cur);}} }//下班了 for(int i=1;i<=n;i++)//服務(wù)區(qū)的人 {if(!win[i].empty())//當(dāng)前的人說(shuō)明還在服務(wù),需要服務(wù)完才能離開(kāi){Node cur=win[i].front();win[i].pop_front();ans[cur.id]=9*60+cur.remain;}while(!win[i].empty())//其余的人都不能接受服務(wù)了{(lán)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(模拟)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: POJ - 1358 Housing C
- 下一篇: PAT (Advanced Level)