需求如下:

某银行的个人业务采用比较流行的取号叫号方式,该行的个人用户分为金卡用户和普通卡用户.
个人业务窗口也分为金卡窗口和普通卡窗口,金卡窗口有金卡客户等待叫号时只为金卡用户服务,
普通卡窗口在有普通卡用户等待叫号时置为普通卡用户服务.
    假定某银行对一个储蓄所做了调查统计,总结出顾客到达的时间间隔在1分钟到3分钟之间,
 每个人的业务需要1分钟到9分钟.
     该储蓄所设立了2个金卡窗口和2个普通卡窗口.

1) 2007年时金卡用户于普通卡用户的比例为3:7. 试模拟一个工作日. 统计金卡用户和普通卡用户各自的平均等待时间.
   (模拟中应该使用随机数生成函数生成用户的到来时间和业务时间)

2) 2010年是金卡用户于普通卡用户的比例变成了 6:4. 试模拟一个工作日. 统计金卡用户和普通卡用户各自的平均等待时间.
3) 设计一种新的工作方式能始终体现出金卡用户的优势.
请自定义数据结构
使用C++编程, 可使用STL.
需要写代码并且可编译运行.

如果图挂了, 请访问如下链接下载:http://pan.baidu.com/share/link?shareid=331538&uk=3959729623

实现代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <arpa/inet.h>
#include <sstream>
#include <vector>
#include <map>
#include <list>
#include <unistd.h> // for usleepusing namespace std;#ifndef foreach
#define foreach(container,it) \for(typeof((container).begin()) it = (container).begin();it!=(container).end();++it)
#endif// vip : novip = 3 : 7
bool get_random_is_vip()
{return random() % 10 < 3;//return false;
}// 下一个客户到来的间隔时间
int get_next_cs()
{return random() % 3 + 1;//return 1;
}// 下一个客户的业务办理所需时间
int get_random_duration()
{return random() % 9 + 1;//return 3;
}// 客户
class CCustomer
{
public:CCustomer():m_is_vip(false),m_time_duration(0), m_time_in(0){}bool IsVip(){return m_is_vip;}void SetVip(bool is_vip){m_is_vip = is_vip;}// 办理业务所需时间(不含等待时间)void SetDuration(int duration){m_time_duration = duration;}int GetDuration(){return m_time_duration;}// 到达银行时间int GetTimeIn(){return m_time_in;}void SetTimeIn(int time_in){m_time_in = time_in;}
private:bool m_is_vip;int m_time_duration;int m_time_in;
};// 银行柜台
class CServicePos
{
public:CServicePos():m_is_vip(false),m_is_busy(false),m_time_use(0),m_time_duration(0){}bool IsVip(){return m_is_vip;}// 是否正在服务客人bool IsBusy(){return m_is_busy;}// 时间流逝一分钟void PassOneMin(){m_time_use ++;if (m_time_use > m_time_duration){m_is_busy = false;m_time_use = 0;m_time_duration = 0;}}void SetVip(bool is_vip){m_is_vip = is_vip;}// 受理一个客户void AcceptOneCs(CCustomer &cs){m_is_busy = true;m_time_use = 1;m_time_duration = cs.GetDuration();}private:bool m_is_vip;bool m_is_busy;int m_time_use;int m_time_duration;
};int main()
{// 4个柜台vector<CServicePos> pos_vec;pos_vec.push_back(CServicePos());pos_vec.push_back(CServicePos());pos_vec.push_back(CServicePos());pos_vec.push_back(CServicePos());// 前两个是vippos_vec[0].SetVip(true);pos_vec[1].SetVip(true);list<CCustomer> cs_list;// 业务办理完毕的客人数目int vip_done_num = 0;int novip_done_num = 0;// 还未开始办理的客人数目 (还在排队中)int vip_wait_num = 0;int novip_wait_num = 0;// 业务办理完的客户的总共等待时间int vip_wait_time = 0;int novip_wait_time = 0;int mins_one_day = 8*60;//int mins_one_day = 100;// 下一个客户将在next_cs分钟后到达int next_cs = 0;// 时间驱动一天for (int i=0; i<mins_one_day; ++i){// 时间过去1分分钟, 更新各个柜台状态foreach (pos_vec, it){it->PassOneMin();}// 有客人到达if (next_cs == 0){next_cs = get_next_cs();// 随机生成客户信息CCustomer cs;cs.SetVip(get_random_is_vip());cs.SetTimeIn(i);cs.SetDuration(get_random_duration());// 加入叫号队列cs_list.push_back(cs);// 更新等待队列中的人数if (cs.IsVip())vip_wait_num++;elsenovip_wait_num++;}// 时间过去一分钟next_cs--;// 检查每个柜台, 如果不忙, 则接客foreach (pos_vec, it){if (it->IsBusy())continue;if (vip_wait_num == 0 && novip_wait_num == 0)break;// 当前柜台是vip柜台if (it->IsVip()){// 优先服务vipbool find_vip_flag = true;if (vip_wait_num == 0)find_vip_flag = false;foreach (cs_list, it_cs){if (find_vip_flag == it_cs->IsVip()){it->AcceptOneCs(*it_cs);//int wait_time = i - it_cs->GetTimeIn();//printf("wait_time:%d\n", wait_time);if (find_vip_flag){vip_wait_num--;vip_wait_time += (i - it_cs->GetTimeIn());vip_done_num++; // 这里不准确!!}else{novip_wait_num--;novip_wait_time += (i - it_cs->GetTimeIn());novip_done_num++;}cs_list.erase(it_cs);break;}}}// 普通柜台else{// 优先服务普通客人bool find_vip_flag = false;if (novip_wait_num == 0)find_vip_flag = true;foreach (cs_list, it_cs){if (find_vip_flag == it_cs->IsVip()){it->AcceptOneCs(*it_cs);// 打印下当前客人的等待时间 调试用//int wait_time = i - it_cs->GetTimeIn();//printf("wait_time:%d\n", wait_time);if (find_vip_flag){vip_wait_num--;vip_wait_time += (i - it_cs->GetTimeIn());vip_done_num++; // 这里不准确!!}else{novip_wait_num--;novip_wait_time += (i - it_cs->GetTimeIn());novip_done_num++;}cs_list.erase(it_cs);break;}}}}}// 一天结束时, 打印下最后时刻柜台的状态printf("一天结束时, 打印下最后时刻柜台的状态\n");printf("pos_vec : \n");int i = 0;foreach (pos_vec, it){printf("index %d , is_busy : %d, is_vip:%d\n", i, it->IsBusy(), it->IsVip());i++;}printf("\n");i = 0;int vip_not_done_num = 0;int novip_not_done_num = 0;int vip_not_done_wait_time = 0;int novip_not_done_wait_time = 0;// 一天结束时, 打印下已经拿了号, 却没有等到办理业务的队列中的客户的信息printf("cs_list : \n");foreach (cs_list, it){printf("index: %d , time_in: %d, wait_time: %d, is_vip:%d\n", i, it->GetTimeIn(), mins_one_day-it->GetTimeIn(), it->IsVip());i++;if (it->IsVip()){vip_not_done_num++;vip_not_done_wait_time += (mins_one_day-it->GetTimeIn());}else{novip_not_done_num++;novip_not_done_wait_time += (mins_one_day-it->GetTimeIn());}}// vip & novip 客户的没有办理业务的人数printf("vip & novip 客户的没有办理业务的人数\n");printf("vip_wait_person_num : %d\n", vip_wait_num);printf("novip_wait_person_num : %d\n", novip_wait_num);printf("\n");// vip & novip 客户的各自的总共等待时间 (只统计没有办理业务的客户)//printf("vip & novip 客户的各自的总共等待时间 (只统计没有办理业务的客户)\n");//printf("vip_not_done_wait_time : %d\n", vip_not_done_wait_time);//printf("novip_not_done_wait_time : %d\n", novip_not_done_wait_time);//printf("\n");// vip & novip 客户的各自的平均等待时间 (只统计没有办理业务的客户)//printf("vip_not_done_wait_time(avg) : %d\n", vip_not_done_wait_time/vip_wait_num);//printf("novip_not_done_wait_time(avg) : %d\n", novip_not_done_wait_time/novip_wait_num);//printf("\n");// vip & novip 客户的成功办理业务的人数printf("vip & novip 客户的成功办理业务的人数\n");printf("vip_done_num : %d\n", vip_done_num);printf("novip_done_num : %d\n", novip_done_num);printf("\n");// vip & novip 客户的各自的总共等待时间 (只统计已成功办理业务的客户)//printf("vip_done_wait_time : %d\n", vip_wait_time);//printf("novip_done_wait_time : %d\n", novip_wait_time);//printf("\n");// vip & novip 客户的各自的平均等待时间 (只统计已成功办理业务的客户)//printf("vip_done_wait_time(avg) : %d\n", vip_wait_time / vip_done_num);//printf("novip_done_wait_time(avg): %d\n", novip_wait_time / novip_done_num);//printf("\n");// vip & novip 客户的各自的平均等待时间 (没有办理业务的客户也统计在内)printf("vip & novip 客户的各自的平均等待时间 (没有办理业务的客户也统计在内)\n");printf("vip_wait_time(avg) : %d\n", (vip_wait_time + vip_not_done_wait_time) / (vip_done_num + vip_not_done_num));printf("novip_wait_time(avg): %d\n", (novip_wait_time + novip_not_done_wait_time) / (novip_done_num + novip_not_done_num));printf("\n");return 0;
}

默认的输出如下:

一天结束时, 打印下最后时刻柜台的状态

pos_vec :
index 0 , is_busy : 1, is_vip:1
index 1 , is_busy : 0, is_vip:1
index 2 , is_busy : 0, is_vip:0
index 3 , is_busy : 0, is_vip:0

cs_list :
vip & novip 客户的没有办理业务的人数
vip_wait_person_num : 0
novip_wait_person_num : 0

vip & novip 客户的成功办理业务的人数
vip_done_num : 69
novip_done_num : 169

vip & novip 客户的各自的平均等待时间 (没有办理业务的客户也统计在内)
vip_wait_time(avg) : 0

novip_wait_time(avg): 0

当vip和非vip比例调整为: 6:4时,输出如下:
一天结束时, 打印下最后时刻柜台的状态
pos_vec :
index 0 , is_busy : 1, is_vip:1
index 1 , is_busy : 0, is_vip:1
index 2 , is_busy : 0, is_vip:0
index 3 , is_busy : 0, is_vip:0

cs_list :
vip & novip 客户的没有办理业务的人数
vip_wait_person_num : 0
novip_wait_person_num : 0

vip & novip 客户的成功办理业务的人数
vip_done_num : 133
novip_done_num : 105

vip & novip 客户的各自的平均等待时间 (没有办理业务的客户也统计在内)
vip_wait_time(avg) : 0
novip_wait_time(avg): 0

==============================
后记, 当时现场做这个题时, 发现无论vip还是非vip的等待时间都是都是 0. 还以为自己的程序出问题了. 面完回来自己做了下, 还是0. 其实想想, 确实应该是0. 为什么呢?
分析如下:
题目中没隔1~3分钟来一个客户, 我们就固定每2分钟来一个.
题目中每个业务的时间1~9分钟, 我们就固定5分钟.
这样相当于每2分钟来一个客户, 办理时间为5分钟. 进一步简化为, 每1分钟来一个客户, 办理时间为2.5分钟.
这样子, 银行只要提供3(3>2.5)个柜台就可以保证恰好满足所有客户都能不用等待的办理业务. 况且题目中提供了4个柜台, 肯定绰绰有余了~~.

另外, 我们可进一步来简化题目来验证程序的正确性. 把柜台数减少为1个, 把客户的到来间隔时间改为1分钟, 把业务办理所需时间改为1分钟, 这样1个柜台恰好满足需求. 如果把业务办理时间改为2分钟, 就会产生等待, 并且最终有很多人叫了号并却没有机会办理业务. 通过调整程序的参数证明了这一点.

迅雷面试题: 模拟银行一天的工作, 统计vip客户和普通客户的办理业务的平均等待时间.相关推荐

  1. 模拟银行窗口排队叫号系统的运作

    最近在网上看到了一道面试题,初看很简单,细看有点意思的一道题目: http://blog.csdn.net/zhangxiaoxiang/archive/2011/04/01/6294132.aspx ...

  2. [离散事件模拟] 银行窗口模拟 - C语言

    文章目录 问题 思考 离散事件模拟 流程图 主要逻辑 总结:离散事件模拟思想的本质 完整代码 原文链接:https://www.yuque.com/cppdev/algo/zfb73x 这种抽象问题的 ...

  3. 【数据结构Python描述】优先级队列描述“银行VIP客户插队办理业务”及“被插队客户愤而离去”的模型实现

    文章目录 一.支持插队模型的优先级队列 队列ADT扩充 队列记录描述 方法理论步骤 `update(item, key, value)` `remove(item)` 二.支持插队模型的优先级队列实现 ...

  4. 顾客银行办理业务时,首先在取号机上取号,然后坐在椅子上等候业务员叫号时前往窗口办理业务,假设银行现在有3个窗口可办理业务,请采用信号量和PV操作描述顾取号等候叫号和银行业务员叫号办理业务的同步操作。

    顾客银行办理业务时,首先在取号机上取号,然后坐在椅子上等候业务员叫号时前往窗口办理业务,假设银行现在有3个窗口可办理业务,请采用信号量和PV操作描述顾取号等候叫号和银行业务员叫号办理业务的同步操作. ...

  5. 2022保安员(初级)考试试题模拟考试平台操作

    题库来源:安全生产模拟考试一点通公众号小程序 2022保安员(初级)考试题是保安员(初级)复训题库考前押题!2022保安员(初级)考试试题模拟考试平台操作依据保安员(初级)考前押题.保安员(初级)考试 ...

  6. java模拟银行存取_JAVA基础案例 模拟银行存取款业务

    模拟银行存取款业务 编写一个Java应用程序,模拟网上银行登录及存取款业务.登录时需判断银行卡号和银行卡密码,当输入的卡号和密码都正确时,登录成功,提示当前登录的账户名,并进入下一步选择操作类型.操作 ...

  7. C语言程序模拟银行输入密码,模拟银行输入密码--源码

    原标题:模拟银行输入密码--源码 C语言-模拟银行输入密码 //C语言-模拟银行输入密码 #include #include int main() { int pass;//存放密码的变量 int i ...

  8. java银行叫号模拟系统_Java 模拟银行叫号机

    创建一个程序,利用多线程模拟银行的排号器的工作过程,即利用多个线程模拟客户到排号器上取号的过程. 提示:设计一个类用于产生号码,设计多个线程模拟用户得到号码.BANK 排号的实现 SroNum 类 p ...

  9. Python基础项目实践之:面向对象方法实现模拟银行管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

最新文章

  1. 2022-2028年中国能源期货市场深度调研及投资前景预测报告
  2. 几种Linux包管理系统的命令对照
  3. 华为设备不会配置静态路由怎么办?
  4. SAP Cloud Platform certificate trust下载和business role创建
  5. HashMap两种遍历数据的方式
  6. python 消息队列 get是从队首还是队尾取东西_从零开始Python对redis作为消息队列的使用...
  7. Python中的全局变量与局部变量2
  8. php钓鱼怎么使用方法,路亚钓法操作步骤及抛投技巧
  9. ios apns netty java codec 防止粘包
  10. python变量定义 关键字_(四)Robot Framework 基础关键字
  11. XML DataBase之Xindice(二)
  12. pane Java_ToolPane.java
  13. 2022 最新 R 语言 与 RStudio 安装配置教程
  14. xml文件导入wps_Office12使用XML格式存储文件回击WPS
  15. 学习linux 服务器安全这一篇文章就够了
  16. Android 自定义歌词滚动
  17. 12864液晶8x16ascii点阵_【单片机自学】7.液晶实验
  18. 游安军编著的计算机数学答案,计算机数学
  19. 论文阅读:CNN+GCN
  20. opencv各版本官方下载地址

热门文章

  1. 【MySQL】34道SQL综合练习详解(员工表、部门表、工资等级表)
  2. 笔记本当服务器显示器怎么连接,笔记本当主机显示器的设置方法
  3. SOA:ESB 服务注册中心
  4. Centos 默认网关GATEWAY不生效
  5. 高仿QQ源码 界面(3)
  6. 快桃科技居然给我无条件双倍工资!却又整天瞎搞
  7. centos7 访问php 该网页无法正常运作 目前无法处理此请求
  8. dcs系统opc服务器设置,如何配置紫金桥软件与DCS的OPC进行通讯
  9. H265编码视频流媒体播放器EasyPlayer.js支持9宫格视频同屏播放的写法
  10. word 如何删除边框黑线