题目描述:设计一个银行业务模拟系统,模拟银行的业务运行并计算一天中客户在银行逗留的平均时间。银行有N(N的取值自己定义)个窗口对外接待客户,从早晨银行开门起不断有客户进入银行。由于每个窗口在某个时刻只能接待一个客户,因此在客户人数众多时需在每个窗口前顺次排队,对于刚进入银行的客户,如果某个窗口的业务员正空闲,则可上前办理业务;反之,若N个窗口均有客户所占,他便会排在人数最少的队伍后面。
基本要求:
(1)在界面上可以设定银行的对外营业时间(银行的开门时间以及银行的关门时间)。
(2)用人机交互的方式来输入客户的到达时间以及客户的业务处理时间,用队列来存储客户的到达事件和客户的离开事件。
(3)可以友好的显示出在某一天中整个银行系统中客户在银行逗留的平均时间。

解题思路:类似银行取号系统:比如:哪怕之前某个时刻看似排队在1号窗口(人数最少)最快,但是中途发现其他窗口更快,可以随时调离,取最优情况。

下载链接:点击打开链接

代码

#include<bits/stdc++.h>
#include<cmath>#define mem(a,b) memset(a,b,sizeof a)
#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;struct P
{int sh,sm,ss; // * 进入时间int eh,em,es; // * 离开时间int ssum,esum; // 进入时间(s) 离开时间(s)int ds,ws; // 处理时间deal(s) 等候时间(s)
};int cmp(P p1,P p2) // *
{return p1.ssum<p2.ssum;
}int cmp2(P p1,P p2) // *
{return p1.esum<p2.esum;
}struct pq_cmp // 根据先到达的人先处理业务
{bool operator()(P p1,P p2){return p1.ssum>p2.ssum; // 进入的时间:从小到大}
};struct dpq_cmp // 根据先离开的人先交接并计算结果
{bool operator()(P p1,P p2){return p1.esum>p2.esum; // 离开的时间:从小到大}
};// 优先队列
// dpq作用:主要用来与下一个交接窗口的人的时间差维护,方便下次加入dpq时,
// 判断谁先出来(即哪个窗口先为空),计算该人离开的逗留时间和。
priority_queue<P,vector<P>,pq_cmp> pq; // 存储入队的人优先到达银行的排在Top
priority_queue<P,vector<P>,dpq_cmp> dpq; // 存储入队的人优先离开银行的排在Topint h1,m1,s1,h2,m2,s2,n; // 银行营业时间 窗口数void init() // 初始化
{while(!pq.empty()) pq.pop();while(!dpq.empty()) dpq.pop();
}void showBankTime()
{printf("Bank OpenTime:\n");printf("%02d:%02d A.M.\n",h1,m1);printf("%02d:%02d P.M.\n\n",h2,m2);
}int main()
{printf("Please input Bank OpenTime (hh:mm:ss): ");while(~scanf("%d:%d:%d %d:%d:%d",&h1,&m1,&s1,&h2,&m2,&s2)){printf("Please input Bank Windows Count: "); scanf("%d",&n);printf("\n-----------Start-----------\n");init();showBankTime();int sum,len; sum=len=0; // sum:所有客户逗留时间 len:客户总数int sh,sm,ss,ds; // 客户进入银行时间 客户处理业务所需时间P ps[1000]; // *printf("Ps: Button Ctrl + Z as input end!\n");printf("Please input People ArriveTime(hh:mm:ss) and DealTime(s):\n");while(~scanf("%d:%d:%d %d",&sh,&sm,&ss,&ds)) // Crtl + Z == break{P tp;tp.ds=ds;tp.esum=tp.ssum=sh*3600+sm*60+ss;tp.esum+=ds;tp.ws=0;tp.sh=sh; tp.sm=sm; tp.ss=ss; // *pq.push(tp);ps[len]=tp; // *len++;printf("Please input People ArriveTime(hh:mm:ss) and DealTime(s):\n");}//        printf("-------PQueue------\n"); // *
//        for(int i=0;i<len;i++) // *
//        {
//            P tp=pq.top(); pq.pop();
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n\n",tp.ds);
//        }
//        printf("-------PQueue------\n"); // *//        sort(ps,ps+len,cmp); // *
//        printf("-------------------\n"); // *
//        printf("\nPNum == %d\n\n",len); // *
//        for(int i=0;i<len;i++) // *
//        {
//            P tp=ps[i];
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("WS : %d\n",tp.ws);
//            printf("DS : %d\n\n",tp.ds);
//        }
//        printf("-------------------\n"); // *for(int i=0;i<n;i++) // 补满第一批一开始空的窗口{dpq.push(pq.top());pq.pop();}int k=0; // *while(!pq.empty()) // 即将进入dpq的预备队列pq里如果没有客户,即可退出{P tdpq=dpq.top(); // 最早离开银行的客户// *
//            printf("%dth:\n",k);
//            P tp=tdpq;
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);ps[k++]=tdpq; // *dpq.pop();P tpq=pq.top(); // 下一个最早进入银行的客户// 判断是否下个客户需要等待if(tdpq.esum>tpq.ssum) // 需等待{tpq.ws=tdpq.esum-tpq.ssum; // 即将进入窗口(下个客户)的等待时间tpq.esum+=tpq.ws; // 提前计算出即将进入窗口(下个客户)离开的时间}
//            else // 无需等待,此处else代码可以省略,因为初始化的时候就是默认该值
//            {
//                tpq.ws=0;
//                tpq.esum+=tpq.ws;
//            }sum+=tdpq.esum-tdpq.ssum; // 计算该离开客户的时间差
//            printf("sum == %d\n\n",sum); // *dpq.push(tpq); pq.pop();}while(!dpq.empty()) // 如果dpq里还有剩余的客户,进行最后计算处理{P tdpq=dpq.top();ps[k++]=tdpq; // *dpq.pop();sum+=tdpq.esum-tdpq.ssum;// *
//            printf("%dth:\n",k);
//            P tp=tdpq;
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);//            printf("sum == %d\n\n",sum); // *}//        sort(ps,ps+k,cmp2); // *
//        printf("-------------------\n"); // *
//        printf("\nOutNum == %d\n\n",k); // *
//        for(int i=0;i<k;i++) // *
//        {
//            P tp=ps[i];
//            printf("P%d:\n",i);
//            printf("SH:SM:SS : %d:%d:%d\n",tp.sh,tp.sm,tp.ss);
//            printf("SSUM : %d\n",tp.ssum);
//            printf("DS : %d\n",tp.ds);
//            printf("WS : %d\n",tp.ws);
//            int tp_esum=tp.esum;
//            tp.eh=tp_esum/3600; tp.em=(tp_esum%3600)/60; tp.es=tp_esum%60;
//            printf("EH:EM:ES : %d:%d:%d\n",tp.eh,tp.em,tp.es);
//            printf("ESUM : %d\n\n",tp.esum);
//        }
//        printf("-------------------\n"); // *printf("\nAll People Num: %d\n",len);printf("All time: %d s\n",sum);printf("Avg time: %.2lf s\n",sum*1.0/len);printf("\n-----------END-----------\n\n");printf("Please input Bank OpenTime: ");}return 0;
}

小玩意 - 银行业务的模拟系统(C++)相关推荐

  1. 银行业务模拟系统的设计与实现

    [实验目的] 了解离散事件的模拟机制(模拟银行系统): 掌握队列的基本操作,加深对队列数据结构的理解: 加强抽象数据类型的能力. [实验原理] 创建队列类的定义,时间类和银行类的定义. 队列的每个元素 ...

  2. 【JAVA小游戏+水果售卖系统】基于GUI界面编程的水果“人生”模拟系统

    [JAVA]基于GUI界面编程的水果"人生"模拟系统 一.系统主要功能及简介 二.系统体系结构 三.系统设计技术 四.编码说明 五.效果展示 一.系统主要功能及简介 该系统以JAV ...

  3. 上海高考听说测试什么软件,2021上海市高考外语听说测试模拟系统使用方法及注意事项...

    2021年上海市高考外语听说测试模拟系统如何使用?有哪些注意事项?小编整理了相关内容如下,大家快来了解一下吧! 2021年上海市高考外语听说测试模拟系统使用注意事项 试音 佩戴耳机时,话筒应略低于嘴巴 ...

  4. 模拟系统照相机图片裁剪的功能

    模拟系统照相机图片裁剪的功能 效果如下: 源码: // // RootViewController.m // ScrollView // // Copyright (c) 2014年 Y.X. All ...

  5. 上海浦发银行总行信息科技部大数据专家陈春宝:大数据与机器学习重塑零售银行业务...

    人工智能.区块链.容器技术等新兴技术的快速演进和发展,正在不断地推进企业数字化变革.8月10日,由上海市经济和信息化委员会.上海市国有资产监督管理委员会指导,上海市国有资产信息中心.上海市计算机用户协 ...

  6. java 面试题之银行业务系统

    1.需求 模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客 ...

  7. linux stress 命令 模拟系统高负载

    stress 命令主要用来模拟系统负载较高时的场景,本文介绍其基本用法.文中 demo 的演示环境为 ubuntu 18.04. 基本语法 语法格式: stress <options> 常 ...

  8. 7-18 银行业务队列简单模拟 (25 分)

    7-18 银行业务队列简单模拟 (25 分) 设某银行有A.B两个业务窗口,且处理业务的速度不一样,其中A窗口处理速度是B窗口的2倍 -- 即当A窗口每处理完2个顾客时,B窗口处理完1个顾客.给定到达 ...

  9. Screenlets:桌面小玩意

    Toy Posted in Apps, Desktop StuffRSSTrackback Screenlets 是一款可以在桌面上添加种种小玩意的软件,如即时贴.时钟.气候预告.月历等等.这个软件和 ...

  10. java 之 面试题-银行业务调度

    模拟实现银行业务调度系统逻辑,具体需求如下: 银行内有6个业务窗口,1 - 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. 有三种对应类型的客户:VIP客户,普通客户,快速客户(办理如 ...

最新文章

  1. ECharts学习总结(五):echarts的Option概览
  2. java指针操作符_rxjava 操作符大全
  3. java 委托机制_通过反射实现Java下的委托机制代码详解
  4. kotlin学习笔记——单元测试
  5. pandas DataFrame 数据处理常用操作
  6. 开发Eclipse插件
  7. php数字取反,[转+自]关于PHP7的新特性(涉及取反和disabled_functions绕过)
  8. wxpython的sizer_wxPython BoxSizer布局
  9. Android 下 Kernel Debug (Qualcomm Chipset)
  10. mac xcode c++ cin cout注意细节一
  11. 码农的自我修养 - ARM处理器天梯图
  12. Unity UGUI 图文混排
  13. PWM控制LED亮度变化的原理(超详解)
  14. linux如何更改mac地址
  15. 2019机器学习框架之争:与Tensorflow竞争白热化,进击的PyTorch赢在哪里?
  16. php ean-13,用php生成EAN_13标准的条形码_php
  17. 信号与系统--冲激响应
  18. What is modularity And how to achieve modularity
  19. java代理一(静态代理)
  20. PYTHON 获取邮件发送时间

热门文章

  1. 2021上海交大网络安全保研夏令营经验
  2. linux转录组kegg注释,KEGG pathway 注释整理
  3. activemq_CVE-2015-5254_漏洞复现_源码分析
  4. 安卓手机获取root权限---修补面具root步骤解析
  5. 读《如何找对另一半》后感以及论自己择偶标准
  6. java 工厂模式例子_java 工厂模式简单介绍及例子
  7. python中判断小写字符_Python islower()函数 判断字符串中字符是否都为小写
  8. java中dao和dao.impl_java 包 dao 和 dao.impl 问题
  9. 墨画子卿第四章第5节:两个时辰
  10. 颂钵带给我们是什么感受