DS队列----银行单队列多窗口模拟

题目描述

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

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。

输入

输入第1行给出正整数N(≤),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤),为开设的营业窗口数。

输出

在一行中输出平均等待时间(输出到小数点后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 62

提示

#include<iostream>
#include<queue>
#include<iomanip>
using namespace std;
int queindex(int total,queue<int>Q)
{
    int index=0;
    queue<int>temp=Q;
    while(!temp.empty())
    {
        temp.pop();
        index++;
    }
    return total-index+1;
}

int main()
{
    int virclock=0;
    double averagewait=0;
    int maxwait=0;
    int alreadytime=0;
    queue<int>arrivetime;///客户到的时间
    queue<int>solvetime;///办业务的时间
    int T;
    cin>>T;
    int timewait[T];///各个客户等待的时间,各项初始化为0
    for(int i=0;i<T;i++)
        timewait[i]=0;
    for(int i=0;i<T;i++)
    {
        int n,t;
        cin>>n>>t;
        arrivetime.push(n);
        solvetime.push(t);
    }
    int K;
    cin>>K;
    queue<int>bank[K];
    int done=0;
    while(done==0)
    {
        for(int i=0;i<K;i++)
        {
            if(bank[i].empty())///银行有空位
            {
                if(!arrivetime.empty()&&arrivetime.front()<=virclock)///有人到银行
                {
                    bank[i].push(solvetime.front());
                    arrivetime.pop();
                    solvetime.pop();
                }
            }
        }
        int bankemp=0;///银行还有几个空位,当空位为0时判断一下是否还有人在等待
        for(int i=0;i<K;i++)
            if(bank[i].empty())
                bankemp++;
        if(bankemp==0)
        {
            queue<int>temp=arrivetime;
            while(!temp.empty()&&temp.front()<=virclock)///如果有人等,找他是第几个客户,数组等待时间加
            {
                int number=queindex(T,temp);
                timewait[number-1]+=1;
                temp.pop();
            }
        }

        for(int i=0;i<K;i++)///该分钟的处理
        {
            if(!bank[i].empty())
            {
                int temp=bank[i].front()-1;
                bank[i].pop();
                bank[i].push(temp);
                if(bank[i].front()==0)
                {
                    bank[i].pop();
                }
            }
        }

        int emp=1;///判断是否完全结束
        for(int i=0;i<K;i++)
        {
            if(!bank[i].empty())
            {
                emp=0;
                break;
            }
        }
        if(emp==1&&arrivetime.empty()&&solvetime.empty())
            done=1;

        virclock++;///进入下一分钟
    }
    for(int i=0;i<T;i++)///分别计算平均等待时间与最大等待时间
    {
        if(maxwait<timewait[i])
            maxwait=timewait[i];
        averagewait+=timewait[i];
    }
    averagewait/=T;
    alreadytime=virclock;
    cout<<fixed<<setprecision(1)<<averagewait<<" ";
    cout<<maxwait<<" ";
    cout<<alreadytime<<endl;
    return 0;
}

原文地址:https://www.cnblogs.com/SZU-DS-wys/p/12180737.html

时间: 2024-10-18 15:37:59

DS队列----银行单队列多窗口模拟的相关文章

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

假设银行有K个窗口提供服务,窗口前设一条黄线,所有顾客按到达时间在黄线后排成一条长龙.当有窗口空闲时,下一位顾客即去该窗口处理事务.当有多个窗口可选择时,假设顾客总是选择编号最小的窗口. 有些银行会给VIP客户以各种优惠服务,例如专门开辟VIP窗口.为了最大限度地利用资源,VIP窗口的服务机制定义为:当队列中没有VIP客户时,该窗口为普通顾客服务:当该窗口空闲并且队列中有VIP客户在等待时,排在最前面的VIP客户享受该窗口的服务.同时,当轮到某VIP客户出列时,若VIP窗口非空,该客户可以选择空

队列应用——循环分配器、银行服务模拟

1.循环分配器 为在客户群体中共享某一资源(比如多个应用程序共享同一CPU),可以借助队列Q实现一个资源循环分配器. RoundRobin{//循环分配器 Queue Q(clients);//参与资源分配的所有客户组成队列Q while(!serviceClosed()){//在服务关闭之前,反复地 e=Q.dequeue();//对首的客户出队,并 serve(e);//接受服务,然后 Q.enqueue(e);//重新入队 } } 在以上轮值算法中,首先令所有参与资源分配的客户组成一个队列

密集负载下的网卡中断负载均衡smp affinity及单队列RPS

原文 http://rfyiamcool.blog.51cto.com/1030776/1335700     简单的说就是,每个硬件设备(如:硬盘.网卡等)都需要和 CPU 有某种形式的通信以便 CPU 及时知道发生了什么事情,这样 CPU 可能就会放下手中的事情去处理应急事件,硬件设备主动打扰 CPU 的现象就是硬件中断. 关于SMP IRQ affinity? 新的内核, Linux改进了分配特定中断到指定的处理器(或处理器组)的功能. 这被称为SMP IRQ affinity, 它可以控

JS~模拟表单在新窗口打开,避免广告拦截

说起广告拦截,这应该是浏览器的一个特性,它会将window.open产生的窗口默认为一个广告,将它进行拦截,但有时,这不是我们所希望的,有时,我们就是需要它在客户端的浏览器上弹出一个新窗口,以展示数据处理的更新结果,例如,一个创建商品的预览功能,它需要先保存数据,然后再在新窗口展示最新的信息,这种需求并不少,而大多数人的作法就是使用window.open去弹窗口,但它确实不是一种好的方式! 新方式来了 我们知道表单提交实际上可以把POST的结果响应到新窗口上,我们就是利用表单的这种性质,在JS中

栈,队列,单链表,双向链表

1. 定义头文件 实现栈方法的定义,注意这里用到了全局的静态数组,可以通过这种方式保护数据. main.c,实现存储 队列,创建头文件queue.h 创建queue.c 实现main函数 单链表 在定义头文件的时候,最好使用: #ifndef 变量A #define变量A 函数声明和结构声明等声明 #endif 通过上面的这种方式可以避免重复调用头文件时候产生的负面影响. 定义头文件link.h:(注意加上extern) 定义link.c 编写main.c 4.双向链表 创建link.h头文件

栈、队列、单链表

栈: <span style="color:#000000;">#define MAX_SIZE 100//队列的最大长度 //-------------------------栈----------------------- int top=0;//栈顶变量 void add(char st[],char intput){ //入栈函数 st[top]=intput; top++; } void pop(char st[]){ //出栈函数 top--; st[top]=

数据结构Java实现07----队列:顺序队列&amp;顺序循环队列、链式队列、顺序优先队列

数据结构Java实现07----队列:顺序队列&顺序循环队列.链式队列.顺序优先队列 一.队列的概念: 队列(简称作队,Queue)也是一种特殊的线性表,队列的数据元素以及数据元素间的逻辑关系和线性表完全相同,其差别是线性表允许在任意位置插入和删除,而队列只允许在其一端进行插入操作在其另一端进行删除操作. 队列中允许进行插入操作的一端称为队尾,允许进行删除操作的一端称为队头.队列的插入操作通常称作入队列,队列的删除操作通常称作出队列. 下图是一个依次向队列中插入数据元素a0,a1,...,an-

队列理论和队列网络模型 queueing theory and queueing network model

(学了大半个月,赶紧把脑袋里装的东西倒一点点出来,不然就忘记了.看别人的PPT都是顺理成章.一气呵成,看我能讲出多少东西) 1队列理论 队列在生活中随处可见,例如排队买票,排队打饭,排队做地铁等等.那将诸如此类的队列抽象一下,可归纳为一下3要术:排队能容纳的总人数(例如食堂空间只有那么大,最长的队伍只能容纳20人).服务率(例如食堂阿姨打菜的速度).等待时间.   我们通过数学公式以及生活常识可得到如下关系:排队总人数=服务率乘以等待时间. 将队列理论应用于服务器处理的排队,那么排队的要素增加一

09.循环队列与链队列

一.队列与循环队列 1.队列 (1)队列(queue)是只允许在一端进行插入操作,而在另一端进行删除操作的线性表.队列是一种先进先出(Fiirst In First Out)的线性表,简称FIFO.允许插入的一端称为队尾,允许删除的一端称为队头. 从队列的定义可知,队列的入队操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为O(1).队列的删除操作,与栈不同的是,队列元素的出列是在队头,即小标为0的位置,若要删除一个元素的话,需要移动队列的所有元素,因此事件复杂度为O(n).