PAT 1014. Waiting in Line (30)
2015-05-07 13:19
399 查看
题目说明:银行有N个服务窗口,每个窗口可排一队,每个窗口可容纳排队人数M人,当天的客户数有K个,询问时间的客户Q个。客户会选择队列最短的窗口去排队,若窗口都满了,剩下的人等待,有人离开后再选择窗口排队,银行营业时间从8:00到17:00。输入M个客户的服务持续时间,Q个客户的编号,输出Q个客户的服务结束时间,若被服务时间大于等于17:00,输出“Sorry”。
注意:被服务时间是服务的开始时间,大于或等于17:00都无法被服务。
思路:用队列queue数组存放在窗口排队的客户winq[]。开始循环:依次对K个客户,若有窗口未满,找到最短队列,入队;若都满了,找到最早结束服务的客户队列,出队;直到所有客户都出队。
代码:
题目中的Sorry中S是大写的,这个错误纠结了好久才发现,所以在输出时尽量复制样例的文字。
注意:被服务时间是服务的开始时间,大于或等于17:00都无法被服务。
思路:用队列queue数组存放在窗口排队的客户winq[]。开始循环:依次对K个客户,若有窗口未满,找到最短队列,入队;若都满了,找到最早结束服务的客户队列,出队;直到所有客户都出队。
代码:
#include<iostream> #include<fstream> #include<queue> using namespace std; /* by dayu */ #define MAXC 1005 #define MAXW 25 #define STARTTIME 8 #define CLOSETIME 540 int winnum;//窗口数 int wincap;//每个窗口的容量 int K,Q; int ask[MAXC];//Q个询问的客户 int processtime[MAXC];//服务持续时间 int totaltime[MAXC];//服务结束时间 int servetime[MAXC];//服务开始时间 queue <int> winq[MAXW];//所有窗口的队列 int shortestque(); void leaveque(); void printtimeformat(int time,int servetime); int main(){ cin>>winnum>>wincap>>K>>Q; for(int i=1;i<=K;i++){ cin>>processtime[i]; } for(int i=1;i<=Q;i++){ cin>>ask[i]; } for(int i=1;i<=K;){ //找到最短的队列s int s=shortestque(); //若队列s未满,入队 if(winq[s].size()<wincap){ int b; if(!winq[s].empty()){ b=winq[s].back(); totaltime[i]=processtime[i]+totaltime[b]; servetime[i]=totaltime[b]; } else{ totaltime[i]=processtime[i]; servetime[i]=0; } winq[s].push(i); i++; } //若队列都满了,出队 else{ leaveque(); } } for(int i=1;i<=Q;i++){ int a=ask[i]; printtimeformat(totaltime[a],servetime[a]); } return 0; } void printtimeformat(int time,int servetime){ //被服务的时间大于等于17:00 if(servetime>=CLOSETIME){ printf("Sorry\n");//S要大写 return; } int hour=time/60; int minute=time%60; hour+=STARTTIME; printf("%02d:%02d\n",hour,minute); } void leaveque(){ int mintime=10000; //找到最早结束服务的队列,记下时间 for(int i=1;i<=winnum;i++){ int min=winq[i].front(); if(totaltime[min]<mintime){ mintime=totaltime[min]; } } //时间等于最小时间的都出队 for(int i=1;i<=winnum;i++){ int min=winq[i].front(); if(totaltime[min]==mintime){ winq[i].pop(); } } } //找到最短的队列 int shortestque(){ int minque=100; int s; for(int i=1;i<=winnum;i++){ if(winq[i].size()<minque){ minque=winq[i].size(); s=i; } } return s; }
题目中的Sorry中S是大写的,这个错误纠结了好久才发现,所以在输出时尽量复制样例的文字。
相关文章推荐
- PAT 1014. Waiting in Line (30)
- 【PAT甲级】1014. Waiting in Line (30)
- PAT 1014. Waiting in Line (30)
- 【PAT Advanced Level】1014. Waiting in Line (30)
- PAT (Advanced) 1014. Waiting in Line (30)
- PAT 1014. Waiting in Line (30)
- PAT 1014. Waiting in Line (30)
- PAT (Advanced Level) Practise 1014. Waiting in Line (30)
- 【PAT Advanced Level】1014. Waiting in Line (30)
- PAT (Advanced Level) 1014. Waiting in Line (30) 银行排队
- PAT刷题:1014. Waiting in Line (30)
- PAT 甲 1014. Waiting in Line (30)(优先队列)
- PAT(A) - 1014. Waiting in Line (30)
- PAT - 甲级 - 1014. Waiting in Line (30)(STL-queue)
- PAT (Advanced) 1014. Waiting in Line (30)
- [PAT]1014. Waiting in Line (30)
- PAT (Advanced Level) Practise 1014. Waiting in Line (30)
- [ZJU.PAT] 1014. Waiting in Line (30)
- [PAT甲级]1014. Waiting in Line (30)(银行排队办理业务结束时间 队列的应用)
- PAT_A 1014. Waiting in Line (30)