银行排队问题平均等到时间计算java?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了银行排队问题平均等到时间计算java?相关的知识,希望对你有一定的参考价值。

每天银行会开放m个业务窗口来为我们n个客户办理业务,当有客户需要办理业务时,先选择可以办理业务的窗口,如果有多个窗口可以办理业务就选择空闲时间最长的窗口,如果有多个窗口空闲的时间一样长,则选择序号小的窗口办理业务。假设已经知道每个人到达时间和办理耗时(均为自然整数),现在请你算算我们平均需要等待多久呢?可使用控制面板直接输出最终结果,也可使用图形界面进行交互式展示。可严格按照到达先后顺序进行业务办理,也可按照非先后顺序进行最优求解。
输入: m(<20)、n(<200)、n对整数(到达时间和办理耗时)
输出:平均等待的时间,保留两位小数。
样例输入2 6 1 3 4 1 5 3 9 2 13 4 13 3
样例输出0.00

首先需要两个数据结构:一个是有序事件链表,一个是队列。

每个事件项的数据结构为:
typedef struct

      int OccurTime;

      int NType;

Event,ElemType;

2)链表的结构:
typedef struct     LinkList

      ElemType data;

      struct     LinkList*next;

LinkList;
参考技术A 现在一般上银行都是在大厅或者自助机里取钱,一般都不上柜台办,排队是正常的,最主要的是有耐性。 参考技术B 这个是计算不出来的,因为人有的办的业务需要耗费的时间,有的办的业务需要耗费时间短。 参考技术C 这个我记得课本上就有,无非就是一个多线程的问题,注意释放线程就可以了。 参考技术D 现在银行排队确实是个问题,建议还是从网上预约,可以省很多的时间

PTA 银行排队问题之单队列多窗口加VIP服务 队列+模拟

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙。当有窗口空闲时,下一位顾客即去该窗口处理事务。当有多个窗口可选择时,假设顾客总是选择编号最小的窗口。

有些银行会给VIP客户以各种优惠服务,例如专门开辟VIP窗口。为了最大限度地利用资源,VIP窗口的服务机制定义为:当队列中没有VIP客户时,该窗口为普通顾客服务;当该窗口空闲并且队列中有VIP客户在等待时,排在最前面的VIP客户享受该窗口的服务。同时,当轮到某VIP客户出列时,若VIP窗口非空,该客户可以选择空闲的普通窗口;否则一定选择VIP窗口。

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。

输入格式:

输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T、事务处理时间P和是否VIP的标志(1是VIP,0则不是),并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤)—— 为开设的营业窗口数,以及VIP窗口的编号(从0到K1)。这里假设每位顾客事务被处理的最长时间为60分钟。

输出格式:

在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。

在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。

输入样例:

10
0 20 0
0 20 0
1 68 1
1 12 1
2 15 0
2 10 0
3 15 1
10 12 1
30 15 0
62 5 1
3 1

输出样例:

15.1 35 67
4 5 1

调了整整一下午,真的恶心,注意看清加粗字体的要求,用队列模拟就行了,因为之前用结构体写过好几次队列了,这次就偷懒直接用STL里的了,代码如下(因为网上代码多是用时间流逝模拟,所以贴出我的代码以供交流学习,还望不要抄袭作业,毕竟可能会查重的:
  1 #include <iostream>
  2 #include <cstdio>
  3 #include <algorithm>
  4 #include <cstring>
  5 #include <queue>
  6 
  7 using namespace std;
  8 
  9 #define INF 0x3f3f3f3f
 10 
 11 const int maxn = 1000 + 5;
 12 
 13 struct people {
 14     int T, P, VIP, counter_id;
 15 }Customer[maxn];
 16 
 17 int main()
 18 {
 19     int n;
 20     scanf("%d", &n);
 21     for(int i = 0; i < n; ++i) {
 22         scanf("%d %d %d", &Customer[i].T, &Customer[i].P, &Customer[i].VIP);
 23         Customer[i].P = min(Customer[i].P, 60);
 24     }
 25 
 26     int K, vipK;
 27     scanf("%d %d", &K, &vipK);
 28 
 29     bool vis[maxn] = {0};
 30 
 31     queue<people> q;
 32 
 33     bool ok = true;
 34 
 35     for(int i = 0; i < n; ++i) {
 36         if(Customer[i].T > 0)
 37             break;
 38         if(Customer[i].VIP) {
 39             ok = false;
 40             Customer[i].counter_id = vipK;
 41             vis[i] = 1;
 42             q.push(Customer[i]);
 43             break;
 44         }
 45     }
 46 
 47     if(ok) {
 48         Customer[0].counter_id = 0;
 49         vis[0] = 1;
 50         q.push(Customer[0]);
 51     }
 52 
 53     int sum = 0, _max = 0, last = 0, now = 0;
 54     int windows[15] = {0}, num_windows[15] = {0};
 55 
 56     while(!q.empty()) {
 57         _max = max(_max, windows[q.front().counter_id] - q.front().T);
 58         sum += max(0, windows[q.front().counter_id] - q.front().T);
 59         windows[q.front().counter_id] = max(windows[q.front().counter_id], q.front().T) + q.front().P;
 60         last = max(last, windows[q.front().counter_id]);
 61         ++num_windows[q.front().counter_id];
 62 
 63         int minn = INF, idx = 0;
 64 
 65         for(int i = 0; i < K; ++i) {
 66             if(windows[i] < minn) {
 67                 minn = windows[i];
 68                 idx = i;
 69             }
 70         }
 71 
 72         while(now < n && vis[now])
 73             ++now;
 74         if(now == n)
 75             break;
 76 
 77         ok = true;
 78 
 79         if(Customer[now].T <= windows[idx]) {
 80             ok = true;
 81             if(idx == vipK || windows[idx] == windows[vipK]) {
 82                 for(int i = now; i < n; ++i) {
 83                     if(!vis[i]) {
 84                         if(Customer[i].T > windows[idx]) {
 85                             break;
 86                         }
 87                         if(Customer[i].VIP) {
 88                             ok = false;
 89                             Customer[i].counter_id = vipK;
 90                             q.push(Customer[i]);
 91                             vis[i] = 1;
 92                             break;
 93                         }
 94                     }
 95                 }
 96             }
 97             if(ok) {
 98                 Customer[now].counter_id = idx;
 99                 q.push(Customer[now]);
100                 vis[now] = 1;
101             }
102         }
103         else {
104             if(Customer[now].VIP && windows[vipK] <= Customer[now].T) {
105                 Customer[now].counter_id = vipK;
106                 q.push(Customer[now]);
107                 vis[now] = 1;
108             }
109             else {
110                 for(int i = 0; i < K; ++i) {
111                     if(windows[i] <= Customer[now].T) {
112                         Customer[now].counter_id = i;
113                         q.push(Customer[now]);
114                         vis[now] = 1;
115                         break;
116                     }
117                 }
118             }
119         }
120         q.pop();
121     }
122 
123     printf("%.1f %d %d
", sum * 1.0 / n, _max, last);
124 
125     for(int i = 0; i < K; ++i) {
126         printf("%d%c", num_windows[i], i == K - 1 ? 
 :  );
127     }
128 
129     return 0;
130 }

 

以上是关于银行排队问题平均等到时间计算java?的主要内容,如果未能解决你的问题,请参考以下文章

1685-银行排队

求解C++模拟银行排队问题

1017 Queueing at Bank

如何确定anylogic中排队问题中服务时间和空闲时间的成本?

银行排队模拟(生产者-消费者模拟)

PTA 银行排队问题之单队列多窗口服务