PintiA 银行排队问题之单队列多窗口服务(25 分)栈与队列
2017-10-14 10:15
633 查看
假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。
在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。
因为之前一段时间的懒惰,好久没有用功学习并且更新博客了,现在开始重新更新博客。
这道题很好玩,因为需要模拟银行的进程所以需要用栈的知识来模拟,但是因为窗口数目的不确定性所以不能确定需要的栈的个数,这是一个需要解决的点。
还有一点就是对数据的处理,如何处理并得到各个客户处理业务的信息这是最有意思的一个点。
我通过构建两个类来分别模拟客户和窗口,用客户类的数据元素来处理看似没有关系的信息并将其联系起来。用窗口类来模拟栈的作用。
本题的重点就是如何通过对时间的处理来模拟银行进程
下附代码:
本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。
输入格式:
输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间
P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤),为开设的营业窗口数。这里假设每位顾客事务被处理的最长时间为60分钟。
输出格式:
在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。
输入样例:
9 0 20 1 15 1 61 2 10 10 5 10 3 30 18 31 25 31 2 3
输出样例:
6.2 17 61 5 3 1
因为之前一段时间的懒惰,好久没有用功学习并且更新博客了,现在开始重新更新博客。
这道题很好玩,因为需要模拟银行的进程所以需要用栈的知识来模拟,但是因为窗口数目的不确定性所以不能确定需要的栈的个数,这是一个需要解决的点。
还有一点就是对数据的处理,如何处理并得到各个客户处理业务的信息这是最有意思的一个点。
我通过构建两个类来分别模拟客户和窗口,用客户类的数据元素来处理看似没有关系的信息并将其联系起来。用窗口类来模拟栈的作用。
本题的重点就是如何通过对时间的处理来模拟银行进程
下附代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> typedef struct { double start; double ends; double wait; }Person; typedef struct { int num; Person List[1005]; }Window; int main() { int n, k; double s, e, time = 0, Min_time = 0, Maxtime = 0; Window all[15]; Person store[10000]; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%lf %lf", &s, &e); if(e > 60){e = 60;} store[i].start = s, store[i].ends = e + s; } scanf("%d", &k); for(int i = 0 ; i < k; i++) { all[i].num = 0; all[i].List[0].ends = 0; } for(int i = 0; i < n; i++) { double mintime = 0; int place = 0; for(int j = 0; j < k; j++) { if(!j) { int num = all[j].num - 1; mintime = all[j].List[num].ends - store[i].start; if(mintime < 0) { mintime = 0; } place = j; //printf("%lf %d %lf\n", mintime, all[j].List[num].ends - store[i].start, place); //printf("%lf %lf\n", all[j].List[num].ends, store[i].start); } else { int num = all[j].num - 1; double time = all[j].List[num].ends - store[i].start; if(time < 0) { time = 0; } if(mintime > time) { mintime = time; place = j; } //printf("++%lf %d %lf\n", mintime, all[j].List[num].ends - store[i].start, place); //printf("%lf %lf\n", all[j].List[num].ends, store[i].start); } //printf("%lf %d\n", mintime, place); } int num = all[place].num; all[place].num++; //printf("%d %d\n", place, all[place].num); all[place].List[num].start = store[i].start + mintime; all[place].List[num].wait = mintime; all[place].List[num].ends = store[i].ends + mintime; //printf("%lf %lf\n", all[place].List[num].ends, all[place].List[num].start); if(!i) { Min_time = mintime; Maxtime = store[i].ends + mintime; } else { if(mintime > Min_time) { Min_time = mintime; } if(Maxtime < store[i].ends + mintime) { Maxtime = store[i].ends + mintime; } } time += mintime; } printf("%.1lf %.lf %.lf\n", time / n, Min_time, Maxtime); for(int i = 0; i < k; i++) { if(i) { printf(" "); } printf("%d", all[i].num); } printf("\n"); return 0; }
相关文章推荐
- PTA 7-1 银行排队问题之单队列多窗口服务(25 分)25分代码 (小模拟)
- 7-1 银行排队问题之单队列多窗口服务(25 分)
- 银行排队问题之单队列多窗口服务
- PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟
- 习题8.1 银行排队问题之单队列多窗口服务
- PTA 银行排队问题之单队列多窗口服务
- 银行排队问题之单队列多窗口服务
- 天梯赛 银行排队问题之单队列多窗口服务 (25分)
- 数据结构课设 银行排队问题之单队列多窗口服务
- PTA 7-5 银行排队问题之单队列多窗口服务
- 银行排队问题之单队列多窗口加VIP服务--PTA数据与结构
- PTA 7-6(队列) 银行排队问题之单队列多窗口加VIP服务(30 分) 30分代码 大模拟
- PTA 7-4(队列) 银行排队问题之单窗口“夹塞”版(30 分) 30分代码
- 8-05. 银行排队问题之“多队列多窗口”版
- PAT 银行排队问题之单窗口“夹塞”版 (队列+模拟) -- 解题报告
- 4 银行排队问题之单队列多窗口加VIP服务 (30分)----模拟
- PTA 7-6(队列) 银行排队问题之单队列多窗口加VIP服务(30 分) 30分代码
- 银行排队问题之单队列多窗口加VIP服务(30 分)
- 统计工龄 模拟EXCEL排序 银行排队问题之单队列多窗口问题 银行业务队列简单模拟 堆栈操作合法性 两个有序序列的中位数
- PTA 7-6 银行排队问题之单队列多窗口加VIP服务