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

离散事件模拟-银行管理

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

示例程序

该题没有说清楚,只要客户是6点之前来到银行,银行就会受理他的业务,如果6点之

后来银行会下班不会受理。。。

#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<string>
#include<queue>

using namespace std;

struct node
{
    int x,y,z,t,h;///x代表客户来的时间,y代表客户办理业务需要的时间,z代表轮到该客户办业务时的时间,t代表该客户自来到银行到办完业务离开的时间,h代表该客户办完业务离开的时间。
};

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        int n;
        queue<node>q1;
        queue<node>q2;
        cin >> n;
        int mm = 0;
        int a,b;
        int x1 = 0;
        int x2 = 0;
        double sum = 0;
        for(int i=0; i<n; i++)
        {
            //printf("%d   %d\n",q1.size(),q2.size());
            cin >> a >> b;
            if(a>=0 && a<=360)
            {
                mm++;
                if(!q1.empty())
                {
                    struct node aa = q1.front();
                    while(aa.h <= a)
                    {
                        sum = sum + aa.t;
                        q1.pop();
                        if(q1.empty())
                        {
                            break;
                        }
                        aa = q1.front();
                    }
                }
                if(!q2.empty())
                {
                    struct node bb = q2.front();
                    while(bb.h <= a)
                    {
                        sum = sum + bb.t;
                        q2.pop();
                        if(q2.empty())
                        {
                            break;
                        }
                        bb = q2.front();
                    }
                }
                if(q1.size() > q2.size())
                {
                    //printf("q1.size = %d    q2.size = %d\n",q1.size(),q2.size());
                    struct node dd;
                    dd.x = a;
                    dd.y = b;
                    if(a >= x2)
                    {
                        dd.z = a;
                    }
                    else
                    {
                        dd.z = x2;
                    }
                    dd.t = (dd.z - a)+ b;
                    dd.h = dd.z + b;
                    q2.push(dd);
                    x2 = dd.h;
                }
                else
                {
                    //printf("q1.size = %d    q2.size = %d\n",q1.size(),q2.size());
                    struct node cc;
                    cc.x = a;
                    cc.y = b;
                    if(a >= x1)
                    {
                        cc.z = a;
                    }
                    else
                    {
                        cc.z = x1;
                    }
                    cc.t = (cc.z - a)+ b;
                    cc.h = cc.z + b;
                    q1.push(cc);
                    x1 = cc.h;
                }
            }
        }
        while(!q1.empty())
        {
            struct node ee;
            ee = q1.front();
            sum = sum + ee.t;
            q1.pop();
        }
        while(!q2.empty())
        {
            struct node ff;
            ff = q2.front();
            sum = sum + ff.t;
            q2.pop();
        }
        double hh;
        hh = (sum) / (mm*1.0);
        printf("%.2lf\n",hh);
    }
    return 0;
}
时间: 2024-10-12 14:43:29

SDUTOJ 2087 离散事件模拟-银行管理的相关文章

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

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

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

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

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

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

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

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

离散事件模型

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

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

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

第十五篇 JS 移入移出事件 模拟一个二级菜单

JS 移入移出事件 模拟一个二级菜单 老师演示一个特别简单二级菜单,同学们除了学习JS,还要注意它的元素和CSS样式. 这节课介绍的是JS鼠标移入.移出事件:onmouseover是移入事件,onmouseout是移出事件.当然还有其他的事件效果,这里就先不说明了. 先直接上一段代码: <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <

浅谈Javascript事件模拟

事件是用来描述网页中某一特定有趣时刻的,众所周知事件通常是在由用户和浏览器进行交互时触发,其实不然,通过Javascript可以在任何时间触发特定的事件,并且这些事件与浏览器创建的事件是相同的.这就意味着会有适当的事件冒泡,并且浏览器会执行分配的事件处理程序.这种能力在测试web应用程序的时候,是非常有用的,在DOM 3级规范中提供了方法来模拟特定的事件,IE9 chrome FF Opera 和 Safari都支持这样的方式,在IE8及以前的办法的IE浏览器有他自己的方式来模拟事件a)Dom

C#自定义事件模拟风吹草摇摆

这是一个自定义事件的例子.C#.WinForm.Visual Studio 2017.在HoverTreeForm中画一块草地,上面有许多草(模拟).HewenqiTianyi类模拟天气,会引发“风”事件(HoverTreeWindEvent),风有东风或西风,或静止.当吹东风,草往西边倒,吹西风则往东边到.静止则草不会东歪西倒.草地上每一颗草都监听HoverTreeWindEvent事件,根据风向(WindDdirection)调整姿态.HewenqiTianyi中有定时器,每隔一段时间触发调