离散事件模拟-银行管理(队列)

离散事件模拟-银行管理

Time Limit: 1000MS Memory limit: 65536K

题目描述

现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数。逗留时间定义为 人员离开的时间减去人员来的时间。银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间。

为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=time<=18,即从中午十二点到晚上十八点,输入数据采用分钟即0代表中午12点,60代表下午一点,90代表下午一点半… 这样time>=0&&time<=360, 如果超出这个时间段概不接受,在这个时间段的一律接受。每个人到达的时间都不一样。顾客到达的时候,总是前往人数少的那个窗口。如果办业务的两个人进入离去发生在同一时间,则遵从先离去后进入。如果人数相当或者两个窗口都没有人总是前往1号窗口。请计算平均逗留时间=总逗留的分钟数/总的人数。

输入

第一行一个整数t(0<t<=100), 代表输入的组数

对于每一组输入一个整数n(0<n<=100),代表有n个人。然后是n行,每行有两个数据 x 与 y。 x代表顾客到达时间,y代表该顾客逗留时间。x y为整数(0=<x<=360)(y>0&&y<=15)。数据保证按顾客来的先后顺序输入。

输出

对于每组数据输出平均逗留时间,保留两位小数。

示例输入

1
1
60 10

示例输出

10.00

提示

来源

GYX

示例程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
    int T,n;
    int in,wait;//进入和逗留的时间;
    int l1,l2;//标记1,2队伍中最后一个离开的时间;
    double sum;//记录总时间;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int a=n;//保存一下n的值  因为后面还要去平均时间;
        l1=l2=0;
        sum=0;
        queue<int >q1,q2;
        while(n--)
        {
            scanf("%d %d",&in,&wait);
            while(!q1.empty()&&q1.front()<=in)//判断原队列是否有人离开,如果当前人的进入时间大于前一个人的离开时间证明前一个人要离开;
                q1.pop();
            while(!q2.empty()&&q2.front()<=in)//同上;
                q2.pop();
            if(q1.size()<=q2.size())//如果队伍1的长度比队伍2的短,进入队伍1;
            {
                if(in<l1)//如果当前人进入的时间比前一个人的离开时间小,则加上前一个人的离开时间
                    wait+=l1;//此时把wait看作是离开时间;
                else
                    wait+=in;
                sum+=(wait-in);//离开时间减去进入时间
                l1=wait;
                q1.push(wait);
            }
            else
            {
                if(in<l2)
                    wait+=l2;
                else
                    wait+=in;
                sum+=(wait-in);
                l2=wait;
                q2.push(wait);
            }
        }
        printf("%.2lf\n",sum/a);
    }
    return 0;
}
时间: 2024-11-07 05:35:46

离散事件模拟-银行管理(队列)的相关文章

离散事件模拟-银行管理(模拟题,队列)

离散事件模拟-银行管理 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数.逗留时间定义为 人员离开的时间减去人员来的时间.银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间. 为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=tim

SDUTOJ 2087 离散事件模拟-银行管理

离散事件模拟-银行管理 Time Limit: 1000MS Memory limit: 65536K 题目描述 现在银行已经很普遍,每个人总会去银行办理业务,一个好的银行是要考虑 平均逗留时间的,即: 在一定时间段内所有办理业务的人员逗留的时间的和/ 总的人数.逗留时间定义为 人员离开的时间减去人员来的时间.银行只有考虑了这一点,我们在办理业务的时候,才不会等太多的时间. 为了简化问题,我们认为银行只有一号窗口和二号窗口可以办理业务 ,并且在时间范围是12<=time<=18,即从中午十二点

第三章:6.栈和队列 -- 离散事件模拟

前言: 本节讲述,队列的入队 和 离队行为,由事件决定情况下,是如何实现的. 目录: 离散事件模拟 正文: 问题:假设某银行有4个窗口对外接待客户,从早晨银行开门起不断有客户进入银行.由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务,反之,若4个窗口均有客户所占,他便会排在人数最少的队伍后面.现在需要编制一个程序以模拟银行这种业务活动并计算一天中客户在银行逗留的平均时间. 解题关键:掌握每个客户

离散事件模拟--银行排队时间模拟 微信:318175542

在数据结构中有个讲述如何模拟银行排队,最终算出每个人平均的逗留时间. 这是需要数据结构的知识.将银行的每个窗口看成是一个队列,那么对于每次来一个人,都需要从最短的队列进行排队.(其实更优秀的做法是从最短的等待时间队列来排队). 这里的做法是这样的,首选在一个队列中插入一个人,整个事件是事件驱动的,每次去检查所有队列,删除那些业务用时已经超出的人,然后选择最短的队列来插入一个人,也就是说,每次插入一个人之前就需要清除队列中的人.然后再选择合适的队列来插入新的人. #include <iostrea

离散事件模型

0x01 代码框架逻辑 模拟内容: 1.离散事件模拟,模拟银行营业时的排队情况 2.不考虑顾客中途离开,顾客到达事件随机,业务办理时间 3.长度随机,选择最短的队排队,不再换队 代码逻辑: 1.一个事件链表,四个窗口排队队列 2.事件驱动:每有一个新的顾客到达,将产生下一个新顾客到达的新事件按时间顺序从小到大(OccurTime)插入事件链表(EventList) (如果此时窗口队列只有 一个顾客,还将产生此顾客离开事件插入事件链表中)      每有一个顾客从某一队列首离开,将产生他的后一位顾

使用事件和消息队列实现分布式事务(转+补充)

虽然本文并非笔者原创,但是我们在非强依赖的事务中原理上也是采用这种方式处理的,不过因为没有仔细去总结,最近在整理和总结时看到了,故转载并做部分根据我们实际情况的完善和补充. 不同于单一架构应用(Monolith), 分布式环境下, 进行事务操作将变得困难, 因为分布式环境通常会有多个数据源, 只用本地数据库事务难以保证多个数据源数据的一致性. 这种情况下, 可以使用两阶段或者三阶段提交协议来完成分布式事务.但是使用这种方式一般来说性能较差, 因为事务管理器需要在多个数据源之间进行多次等待. 有一

hdu 1175 连连看(模拟循环队列)

连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 18149    Accepted Submission(s): 4741 Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线连起来(这条

c#全局鼠标事件以及鼠标事件模拟

最近在编写Max插件时,其主容器FlowLayoutPanel由于隐藏了滚动条,要实现按住鼠标中键上下拖动的功能,因此尝试了全局鼠标事件.以及鼠标勾子,可惜由于Max不争气?都未能实现,于是代码报废,故将其分享于此. 一.全局鼠标事件,首先构建鼠标事件处理器 public delegate void MouseMovedEvent(); public delegate void MouseMDownEvent(); public delegate void MouseMUpEvent(); pu

web前端面试系列 - 数据结构(两个栈模拟一个队列)

一. 用两个栈模拟一个队列 思路一: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时将数据压人s1 3. 出队时将s1弹出,并压人s2,然后弹出s2中的顶部数据,最后再将剩余数据弹出s2,并压人s1. 思路二: 1. 一个栈s1作为数据存储,另一个栈s2,作为临时数据存储. 2. 入队时,判断s1, 是否为空,如果不为空,则将数据直接压入s1, 如果为空,则将s2中的数据全部倒入s1,在将数据压人s1. 3. 出队时,判断s2, 是否为空,如果不为空,则直接弹出s2