【数据结构】银行问题

请用顺序队列或链式队列来完成本题。

我们大多都有在银行排队的经历,唉,那坑爹的排队啊!现在就让我们来算算我们这些客户平均需要等多久吧。
每天刚开始时银行会开m个窗口来为我们total个客户办理业务,当有客户需要办理业务时,先选择可以办理业务的窗口,如果有多个窗口可以办理业务就选择空闲时间最长的窗口,如果有多个窗口空闲的时间一样长,则选择序号小的窗口办理业务。假设我们每个人来到的时间和办理业务所需要的时间(为了简化问题,采用整数表示时间)都知道了。现在请你算算我们平均需要等待多久呢?

【输入形式】

有多组测试数据,每组数据开始有两个正整数m(<20)和total(<200),后面有total对整数,对应客户先后到来的时间以及办理业务所需的时间。

【输出形式】

平均等待的时间,保留两位小数。

【样例输入】

2 6 1 3 4 1 5 3 9 2 13 4 13 3
3 14 0 3 2 2 2 4 5 4 7 2 11 3 12 3 12 4 12 1 13 3 15 4 19 1 22 3 23 2
2 5 0 6 0 5 0 6 7 1 7 2

【样例输出】

0.00
0.29
1.20

【提示】 

题目中选择办理的窗口有三个状态,实际上从序号自小到大查找可以最早办理业务的窗口就已经满足上述三个状态了。

【要求】

请用顺序队列或链式队列来完成,否则不得分。

 

函数:

#include<iostream>
#include<cstring>
using namespace std;
int main() {
    int m, t;
    while (cin >> m >> t) {  //m:办理业务的银行窗口数    t:整个过程办理业务的人数   这一个while循环完 求出了在一个情形下的情况
        int a, b;   //a:每一个客户到来的时间 b:该客户办理业务的时间
        int sum = 0;//办理业务等待时间
        int q[20];//窗口数 上限20个
        memset(q,0,sizeof(q));//把该数组所有值先置为0
        for (int i = 0; i < t; i++) {
            cin >> a >> b;
            int cur = 0;//要去选出哪个窗口办理完上一个业务最快
            int min = q[0];////
            for (int i = 0; i < m; i++) {
                if (q[i] <min) {
                    min = q[i];
                    cur = i;
                }
            }////从min到这 是找出这几个窗口最小的时间 下一个客户到哪个窗口去办理业务

            if (a < q[cur]) { //如果a:到达的时间 比所有的办理业务结束的时间还要小 那么它就得等  sum就要++了
                sum += (q[cur] - a);//q[cur]:最早结束业务的窗口(eg:24)  a:到来的时间(eg:19) 那么就得等24-19=5分钟;
                q[cur] += b;//那么这个窗口就又添了一个新业务(在这个窗口等肯定就要在这办啊) 所以这个窗口结束业务的时间就要再加 +b[上一个人走
新客户立马办 不用加排队的时间哇]
} else { //如果a:到达的时间 比这个q[cur]()小,就是说现在有空余的窗口 那么就直接在这办理业务了 q[cur] = a + b;//那么这个空余的窗口就有了新业务 结束业务的时间:a+b(假设上一个人办完业务是5分走的 8分来了新客人 办理业务3分钟
所以这个窗口结束业务的时间8+3=11分钟)
} } printf("%.2f\n", sum*1.0/t);//算完啦输出 } return 0; }

 

posted @ 2019-03-18 12:10  像走了一光年  阅读(826)  评论(0编辑  收藏  举报