标签:服务 题目 int C++ 解题 时间 PTA 窗口 顾客
1. 队列模拟题目简介
a.题目类型一
- 一个机构中有N个服务窗口
- M个顾客到达机构的时间以及每个顾客需要的服务时间
- 顾客按照到达的时间先后排队等待服务
- 求顾客等待时间,顾客开始接受服务的时间,窗口服务人数等
如1014, 1017, 1026, 以下给出1017题目
b.题目类型二
- 给出顾客开启某项服务的时间以及结束该项服务的时间(一般会有冗余数据)
- 求在指定时间开启该项服务的顾客数,每个顾客开启服务的总时长
如1006, 1016, 1095,以下给出1016题目
c.解题思路
-
如何处理输入的数据?
-
对于时间输入格式的处理
- 时间数据的输入格式一般为
MM:dd:HH:mm
,所以可以采用格式化输入的形式读取
int month, day, hour, min; scanf("%d:%d:%d:%d", &month, &day, &hour, &min);
- 保存时间数据
一般讲所有的时间转化为读入的最小时间单元,用一个变量保存。在这个例子中,将月、日、小时都转化为分钟的形式。
int time = month*31*24*60+day*24*60+hour*60+min;
- 时间数据的输入格式一般为
-
创建数据结构保存数据
对于类型一的题目需要创建
customer
以及window
两个结构体-
customer
结构中,根据题目要求,一般需要保存顾客到达时间,顾客所需服务时长,顾客开始接受服务的时间等。struct customer{ int arrive; int processTime; int start; };
-
window
结构中,根据题目要求,一般需要保存窗口服务完一个客户后的结束时间,窗口当前服务人数等。struct window{ int lastAvailableTime; int count; };
对于类型二的题目一般需要创建
info
结构体以及一个map
用来保存顾客ID与info
的关系-
info
结构体用来保存顾客开启/结束服务的时间以及该时间是开启还是结束服务;struct info{ int time; bool isStart; }
-
map 结构
map<string, vector<struct info> > customerInfo;
-
-
-
如何模拟排队/队列?
对于类型一的题目
-
根据顾客到达的时间先后对所有顾客进行排序
bool cmp(struct customer a, struct customer b){ return a.arrive<b.arrive; } sort(customers.begin(),customers.end(),cmp);
-
找到当前最早空闲的窗口
int index = -1; int minEnd = inf; for(int j =0;j<windows.size();j++){ if(windows[j].lastAvailableTime<minEnd){ minEnd = windows[j].lastAvailableTime; index = j; } }
-
选择该窗口为当前最早到达且还未服务的顾客服务
-
如果该窗口空闲的时间比顾客到达的时间早
顾客不需要等待
窗口下一个空闲时间为顾客到达时间+顾客所需要的服务时间
-
如果该窗口空闲的时间比顾客到达的时间晚
顾客需等待
窗口下一个空闲时间为窗口空闲时间+顾客所需要的服务时间
if(windows[index].lastAvailableTime>customers[i].arrive){ totalWait += windows[index].lastAvailableTime-customers[i].arrive; windows[index].lastAvailableTime += customers[i].process; } else{ windows[index].lastAvailableTime = customers[i].process+customers[i].arrive; }
-
对于类型二的题目
-
根据题意筛选有效信息,去掉只有开启服务没有结束服务或只有结束服务没有开启服务的信息。
这里需要针对每一个顾客的信息按照时间进行排序,选择对应的开启和结束服务时间
for(map<string, vector<struct info> >::iterator it = customers.begin();it!=customers.end();it++){ vector<struct info> vec = it->second; sort(vec.begin(),vec.end(),cmp); for(int i = 0;i<vec.size()-1;i++){ if(vec[i].isOn && vec[i+1].isOn) continue; else if(!vec[i].isOn) continue; else if(vec[i].isOn && !vec[i+1].isOn){ /*------to fill-----------*/ /*------根据题意添加--------*/ i++; } } }
-
根据筛选出来的信息,按照题意计算。
-
2. PTA中的队列模拟题
类型一
题号 (按难度排序) | 题目难点(各题的不同) | 注意事项 |
---|---|---|
1017(25) | 给出窗口数和顾客到达及服务时间 | 晚与17:00到达的顾客 不接受服务也不计入等待时间 |
求所有顾客的平均等待时间 | 注意没有符合要求的顾客时, 需要单独讨论输出0.0 |
|
1014(30) | 给出窗口数和顾客到达及服务时间 | 若当前最快的顾客结束时间已达17:00, 把当前所有窗口正在进行的服务处理完即结束 |
窗口有一定量的排队等待数量 | 需要改变window的结构体struct window{ queue<int> customerID; int lastAvailable = 8*60;}; |
|
求每个顾客离开的时间 | ||
1026(30) | 给出窗口数和顾客到达及服务时间 | 21:00:00时不再接受顾客 |
规定了VIP窗口和VIP客户, VIP客户可以优先使用VIP窗口 |
VIP客户优先使用空闲VIP窗口即使有普通窗口空闲 | |
求顾客开始接受服务和等待服务的时间 |
类型二
题号(按难度排序) | 题目难点(各题的不同) | 注意事项 |
---|---|---|
1006(25) | 求最先开启服务的顾客 以及最晚结束服务的顾客 |
无 |
1016(25) | 不同时间段提供服务的收费价格不同 | 可能有跨天电话 |
求每个顾客每一次服务的花费以及总花费 | ||
1095(30) | 求总服务时间最长的顾客 | |
求在指定时间开启该项服务的顾客数 |
标签:服务,题目,int,C++,解题,时间,PTA,窗口,顾客 来源: https://www.cnblogs.com/zxyLeaf/p/14479290.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。