4-4 D. 银行排队问题之单队列多窗口加VIP服务

题目描述

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

有些银行会给VIP客户以各种优惠服务,例如专门开辟VIP窗口。为了最大限度地利用资源,VIP窗口的服务机制定义为:当队列中没有VIP客户时,该窗口为普通顾客服务;当该窗口空闲并且队列中有VIP客户在等待时,排在最前面的VIP客户享受该窗口的服务。同时,当轮到某VIP客户出列时,若VIP窗口非空,该客户可以选择空闲的普通窗口;否则一定选择VIP窗口。

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间,并且统计每个窗口服务了多少名顾客。

输入 

输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T、事务处理时间P和是否VIP的标志(1是VIP,0则不是),并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10)—— 为开设的营业窗口数,以及VIP窗口的编号(从0到K−1)。这里假设每位顾客事务被处理的最长时间为60分钟。

输入样例:

10
0 20 0
0 20 0
1 68 1
1 12 1
2 15 0
2 10 0
3 15 1
10 12 1
30 15 0
62 5 1
3 1

输出 

在第一行中输出平均等待时间(输出到小数点后1位)、最长等待时间、最后完成时间,之间用1个空格分隔,行末不能有多余空格。

在第二行中按编号递增顺序输出每个窗口服务了多少名顾客,数字之间用1个空格分隔,行末不能有多余空格。

输出样例:

15.1 35 67
4 5 1

思路 

 根据样例分析:

a、设置各窗口预计处理时间(用来表示小括号中的内容),便于得到时间轴与最后完成时间

b、将每个窗口作为一个队列,K个窗口用队列数组表示

c、对VIP客户,处于等待状态时,设置queVip队列,便于处理

d、根据更新的时间轴,更新每个窗口客户开始处理push、客户处理完成pop、客户已到达开始等待push、客户开始处理退出等待pop

e、对于客户的到达时间、处理业务时间、是否VIP信息用二维数组存储,并增加一个等待时间,初始值为-1(若此值为-1即客户业务还未被处理,若 != -1 则客户已经完成业务)

代码 

#include <iostream>
#include <queue>
using namespace std;int main()
{int N,K,VIP;cin >> N;int client[N][4];for(int i = 0; i < N; i++){  //输入数据for(int j = 0; j < 3; j++){cin >> client[i][j];client[i][3] = -1;  //等待时间if(j == 1 && client[i][j] > 60){  //每位顾客事务被处理的最长时间为60分钟client[i][j] = 60;}}}cin >> K >> VIP;queue<int> que[K],queVip;  //que[K] k个窗口,queVip VIP客户的等候队伍int winTime[K],waitNum[K];  //winTime窗口预处理时间 waitNum窗口处理客户数for(int i = 0; i < K; i++){winTime[i] = 0;waitNum[i] = 0;}int time = 0,vipFlag=-1;  //time当前时间while(1){for(int i = 0; i < K; i++){  //当预处理时间<=当前时间时,即对应窗口的客户业务已处理完,popif(winTime[i] <= time && !que[i].empty()){que[i].pop();}}while(!queVip.empty() && client[queVip.front()][3] != -1){  //对已经处理的vip客户 popqueVip.pop();}int v = 0;  //记录已经处于等待状态的客户的末位for(int i = 0; i < N; i++){if(client[i][0] <= time){v++;if(client[i][2] == 1 && i > vipFlag){  //处于等待的VIP客户入queVip队列,vipFlag确保不重复入队queVip.push(i);vipFlag = i;}}else{break;}}if(que[VIP].empty() && !queVip.empty()){  //若vip窗口为空,且有vip客户正在等待que[VIP].push(queVip.front());waitNum[VIP]++;  //该窗口接待客户人数++client[queVip.front()][3] = time - client[queVip.front()][0];  //得到这一客户的等待时间if(winTime[VIP] == 0){  //若预处理时间为0,说明之前还未有客户来过这一窗口,要注意加上已经过去的时间winTime[VIP] = client[queVip.front()][0] + client[queVip.front()][1];}else{winTime[VIP] += client[queVip.front()][1];}queVip.pop();}for(int i = 0; i < K; i++){  //普通窗口的处理if(que[i].empty()){for(int j = 0; j < N; j++){if(client[j][0] <= time) {if(client[j][3] == -1){que[i].push(j);waitNum[i]++;client[j][3] = time - client[j][0];if (winTime[i] == 0) {winTime[i] = client[j][0] + client[j][1];} else {winTime[i] += client[j][1];}break;}}else{break;}}}}int flag = 0, min = 9999, sumPeo=0;;for(int i = 0; i < K; i++){sumPeo += waitNum[i];if(winTime[i] == 0){flag = 1;}if(min > winTime[i]){min = winTime[i];}}if(sumPeo == N){  //所有客户处理完成,退出循环break;}if(flag == 1 || min == time){  //更新时间time = client[v][0];}else{time = min;}}//输出int max=-1, final, sum=0;double aver;for(int i = 0; i < N; i++){sum += client[i][3];if(client[i][3] > max){max = client[i][3];}}aver = sum * 1.0 / N;int waitFinal=0;for(int i = 0; i < K;i++){if(waitFinal < winTime[i]){waitFinal = winTime[i];}}cout << aver << " " << max << " " << waitFinal << endl;for(int i = 0; i < K; i++){cout << waitNum[i];if(i != K-1){cout << " ";}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/652680.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯省一题单

简述 这是我去年准备的一份题单&#xff0c;里面很多都是来自于acwing和leetcode的题目&#xff0c;我去年寒假的时候写了一遍&#xff0c;省赛考前前五天时又开始写了一遍&#xff0c;拿了java组省一。 强调一句&#xff1a;蓝桥杯真题没有必要刷&#xff0c;因为在你参加考试…

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理等等

linux 下scrcpy 手机投屏到电脑,QT+ffmpeg 获取视频流,处理 1 安装 scrcpy 地址 https://github.com/Genymobile/scrcpy 转到 relese 下载 我这里下载的是linux系统 v2.3.1 版本 scrcpy-2.3.1.tar.gz 下载 scrcpy-server v2.3.1 版本 scrcpy-server-v2.3.1 解压scrcpy-2.3…

【小呆的力学笔记】弹塑性力学的初步认知二:应力应变分析(2)

文章目录 1.4 主应力空间、八面体应力1.5 应变分析1.6 特殊应力、应变定义 1.4 主应力空间、八面体应力 一点的应力状态不论如何变化&#xff0c;其主应力和主方向一致的话&#xff0c;该点的应力状态就是唯一确定的。因此&#xff0c;我们用主应力方向建立一个三维坐标系来描…

【算法专题】二分查找(进阶)

&#x1f4d1;前言 本文主要是二分查找&#xff08;进阶&#xff09;的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日…

【前端工程化】环境搭建 nodejs npm

文章目录 前端工程化是什么&#xff1f;前端工程化实现技术栈前端工程化环境搭建 &#xff1a;什么是Nodejs如何安装nodejsnpm 配置和使用npm 介绍npm 安装和配置npm 常用命令 总结 前端工程化是什么&#xff1f; 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块…

77.Go中interface{}判nil的正确姿势

文章目录 一&#xff1a;interface{}简介二、interface{}判空三&#xff1a;注意点四&#xff1a;实际案例 一&#xff1a;interface{}简介 在go中的nil只能赋值给指针、channel、func、interface、map或slice类型的变量 interface 是否根据是否包含有 method&#xff0c;底层…

1333:【例2-2】Blah数集

【题目描述】 大数学家高斯小时候偶然间发现一种有趣的自然数集合Blah&#xff0c;对于以a为基的集合Ba定义如下&#xff1a; (1)a是集合Ba的基&#xff0c;且a是Ba的第一个元素&#xff1b; (2)如果x在集合Ba中&#xff0c;则2x1和3x1也都在集合Ba中&#xff1b; (3)没有其他元…

9. 嵌入式系统开发:安全性与可靠性设计模式---引言

在复杂的嵌入式系统设计中&#xff0c;为了提高嵌入式系统安全性并保护嵌入式系统免受各种潜在故障的影响&#xff0c;可以采用不同的设计模式。这些模式各自有优势和适用的场景&#xff1a; 1. 受保护的单通道模式&#xff08;Protected Single Channel Pattern&#xff09; …

【JavaSE篇】——数组练习

目录 &#x1f6a9;数组转字符串 &#x1f6a9;数组拷贝 &#x1f388;拷贝的实质 &#x1f388;copyOf方法(new) &#x1f36d;copyOf扩容 &#x1f388;arraycopy方法(局部的拷贝)(系统类) &#x1f388;copyOfRange方法(局部拷贝) &#x1f388;原数组.clone() &a…

竞赛练一练 第30期:GESP和电子学会相关题目练习

Day14&#xff1a;CIE一级2022.06_报时的公鸡 故事背景&#xff1a;公鸡在黎明时分会打鸣迎接太阳升起&#xff0c;古人也将鸡鸣声当做晨起的“闹钟”。 1. 准备工作 &#xff08;1&#xff09;背景&#xff1a;根据下图绘制两张背景&#xff1b; 01 02 &#xff08;2&…

python 获取未提前定义的属性报错 KeyError

python 获取未提前定义的属性报错 正文 最近用python编写了一个脚本&#xff0c;是对象形式的数据结构。发现python中对于没有定义的属性名&#xff0c;直接用中括号获取会报错。这一点有别于js。简单记录一下啊具体情况如下&#xff1a; obj {"a": 1,"b&qu…

代码随想录算法训练营Day42|0-1背包理论基础、416. 分割等和子集

目录 0-1背包理论基础 0-1背包问题 二维dp数组01背包 算法实现 一维dp数组01背包 ​编辑算法实现 416. 分割等和子集 前言 思路 算法实现 总结 0-1背包理论基础 0-1背包问题 题目链接https://kamacoder.com/problempage.php?pid1046 有n件物品…

【Javaweb程序设计】【C00162】基于SSM的儿童众筹救助系统(论文+PPT)

基于SSM的儿童众筹救助系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的儿童众筹救助系统 本系统分为登录模块、前台模块、管理员模块、用户模块以及发起人模块5个功能模块. 登录模块&#xff1a;这个功能模块用来让…

如何让haproxy不命中已经失效的服务器

最近在做负载均衡时&#xff0c;服务总是不稳定&#xff0c;经过日志分析&#xff0c;发现是haproxy负载代理时&#xff0c;命中了已经失效的服务节点。那么如何让haproxy不命中已经失效的服务器呢&#xff1f; 你可以配置服务器的健康检查&#xff08;Health Check&#xff09…

vs2019报错MSB4019 找不到导入的项目“BuildCustomizations\CUDA 9.2.props”

在VS中执行生成&#xff0c;报错如下&#xff1a;严重性 代码 说明 项目 文件 行 禁止显示状态 错误 MSB4019 找不到导入的项目“D:\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160\BuildCustomizations\CUDA 9.2.props”。请确认 Import 声明“D:\Microso…

C++进阶(七)AVL树

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、AVL树的概念二、AVL树的旋转1、左单旋2、右单旋3、左右双旋4、右左双旋 三、AVL树的基本实…

jszip和pizzip中文乱码的解决方案

jszip中文乱码的解决方案 jszip官方文档地址&#xff1a;https://stuk.github.io/jszip/ 1、问题分析 在JavaScript中需要用到对Zip压缩包进行操作时&#xff0c;我们往往会使用jszip对压缩包进行编辑。 但是&#xff0c;当我们使用jszip来读取包含中文名的文件时&#xff…

使用ollama本地跑大模型

大家好,我是邵奈一,一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为:被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年,我整理了很多IT技术相关的教程给大家,爱生活、爱分享。 3、如果您觉得文章有用,请收藏,…

SpringCloud--FeignGateWay

Feign 创建项目勾选web SpringWeb 1.0 创建生产者SpringCloudFeignProvider 端口号:8081 pom.xml引入依赖 <!--nacos依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery<…

C语言基础:写一个函数,输入一行字符,将此字符串最长的单词输出

方法一&#xff1a; #include<string.h> int find_longest(char line[])//把数组传过来 {int is_alphabetic(char word);int i 0;int length 0;//统计每个字符串的长度int max 0;//比max长就把值赋值给maxint place 0;//最长单词的起始位置int point;//每个字符串第…