第五周做题总结_数据结构_队列与应用

id:43 A. DS队列之银行排队

题目描述

银行营业大厅共服务3种客户,类型为A\B\C,大厅分别设置了3个窗口分别服务三种客户,即每个窗口只服务一种客户。现有一批客户来银行办理业务,每个客户都有类型和办理业务时间。每个窗口按照客户到来的顺序进行服务。

编程实现它们的办理流程,请使用C++自带的queue必须使用队列实现,其他方法0分!

队列queue的用法如下:

  1. 包含头文件:#include

  2. 定义一个整数队列对象:queue myQe;

  3. 定义一个整数队列对象数组:queue myQA[10];

  4. 入队操作:myQe.push(itemp); //把整数itemp进入队列

  5. 出队操作:myQe.pop(); //把队头元素弹出队列,注意本操作不获取队头元素

  6. 获取队头元素: itemp = myQe.front(); // 把队头元素放入itemp中,注意本操作不弹出元素

  7. 判断队列是否为空:myQe.empty();//队列空则返回true,不空则返回false

输入

第一行输入先输入n表示客户数量

第二行输入每个客户的类型,数据之间用用空格隔开

第三行输入每个客户的办理时间,数据之间用用空格隔开

输出

第一行输出A类客户的平均办理时间

第二行输出B类客户的平均办理时间

第三行输出C类客户的平均办理时间

输入样例

8
A B C B C A A A
10 20 30 40 50 60 70 80

输出样例

55
30
40

题解

题目的数据是先将类型输入进来,然后后面再输入按顺序的类型的客户办理时间,一 一对应,思考的就是怎么将后面输入进来的办理时间与早已输入进来的类型对应,找到关系,因为栈的特点是后进先出,所以第一个输入进来的时间不与第一个输入进来的类型对应,所以不能用栈,而队列的特点就是先进先出,所以第一个输入进来的时间能与第一个输入进来的类型对应,所以我们只需要把类型都压进队列中,当输入进来一个时间后,从队列弹出一个类型,按照这个类型将时间累加进这个类型的时间总和

代码实现

#include <iostream>
#include <queue>
using namespace std;int main()
{int n, i, item, aveA, aveB, aveC, m, cntA, cntB, cntC;char type, ch;queue<char>  myQB;cin >> n;ch = getchar();aveA = 0;aveB = 0;aveC = 0;cntA = 0;cntB = 0;cntC = 0;for (i = 0; i < n; i++){cin >> type;myQB.push(type);}while (!myQB.empty()){cin >> item;m = myQB.front();if (m == 'A'){aveA += item;cntA++;}else if (m == 'B'){aveB += item;cntB++;}else if (m == 'C'){aveC += item;cntC++;}myQB.pop();}cout << aveA / cntA << endl;cout << aveB / cntB << endl;cout << aveC / cntC << endl;return 0;
}

id:44 B. DS队列+堆栈–数制转换

题目描述

对于任意十进制数转换为k进制,包括整数部分和小数部分转换。整数部分采用除k求余法,小数部分采用乘k取整法例如x=19.125,求2进制转换

整数部分19
19 / 2 = 9 … 1
9 / 2 = 4 … 1
4 / 2 = 2 … 0
2 / 2 = 1 … 0
1 / 2 = 0 … 1

小数部分0.125
0.125 * 2 = 0.25 … 0
0.25 * 2 = 0.5 … 0
0.5 * 2 = 1 … 1

所以整数部分转为 10011,小数部分转为0.001,合起来为10011.001

提示整数部分可用堆栈,小数部分可用队列实现

注意:必须按照上述方法来实现数制转换,其他方法0分

输入

第一行输入一个t,表示下面将有t组测试数据。

接下来每行包含两个参数n和k,n表示要转换的数值,可能是非整数;k表示要转换的数制,1<k<=16

输出

对于每一组测试数据,每行输出转换后的结果,结果精度到小数点后3位

输入样例

2
19.125 2
15.125 16

输出样例

10011.001
F.200

提示

例如:十进制数254.3879转换为6进制数。

整数部分254,
254 / 6 = 42 … 2
42 / 6 = 7 … 0
7 / 6 = 1 … 1
1 / 6 = 0 … 1

小数部分0.3879,
0.3879 * 6 = 2.3274 … 2
0.3274 * 6 = 1.9644 … 1
0.9644 * 6 = 5.7864 … 5

所以整数部分转为 1102,小数部分转为0.215,转换后的6进制数合起来为1102.215

题解

  • 第一步要思考的是如何从一个浮点数中提取出它的整数部分和小数部分,整数部分就是用一个整数类型的变量,让这个浮点数直接赋值给这个变量,做强制类型转换,这样就得到了这个浮点数的整数部分,再让这个浮点数减去它的整数就得到了小数部分
  • 第二步就是思考转换,将整数除k求余得到的数压入堆栈,将小数部分乘k取得的整数压入队列,这个过程用循环实现,由于我们要输出小数点后三位,所以对于小数部分的循环,我们的循环条件是这个队列的size要小于3,因为16进制的输出格式特殊,所以我们使用cout << uppercase; // 设置为大写字母cout << nouppercase; // 重置格式以防影响后续输出<< hex来控制格式的输出

代码实现

#include <iostream>
#include <queue>
#include <stack>
#include <iomanip> // 用于设置小数精度
using namespace std;int main()
{int t, i, k, x, m;double n, y;stack<int> s; // 整数queue<int>  myQA; // 小数cin >> t;for (i = 0; i < t; i++){cin >> n >> k;x = n; // 整数部分y = n - x; // 小数// 把值压进去while (x > 0) // 整数{m = x % k; // 余数x /= k;s.push(m);}while (myQA.size() < 3) // 小数{m = y * k; // 积y *= k;y -= m;myQA.push(m);}// 弹出值cout << uppercase; // 设置为大写字母while (!s.empty()) // 若不为空{cout << hex << s.top();s.pop();}cout << ".";while (!myQA.empty()){cout << hex << myQA.front();myQA.pop();}cout << endl;// 重置格式以防影响后续输出cout << nouppercase;}return 0;
}

id:45 C. DS队列–组队列

题目描述

组队列是队列结构中一种常见的队列结构,在很多地方有着广泛应用。组队列是是指队列内的元素分组聚集在一起。组队列包含两种命令:

  1. ENQUEUE,表示当有新的元素进入队列,首先会检索是否有同一组的元素已经存在,如果有,则新元素排在同组的最后,如果没有则插入队列末尾。

  2. DEQUEUE,表示队列头元素出队

  3. STOP,停止操作

建议使用C++自带的队列对象queue,编程更方便

输入

第1行输入一个t(t<=10),表示1个队列中有多少个组

第2行输入一个第1组的元素个数和数值

第3行输入一个第2组的元素个数和数值

以此类推输入完t组以定义同组元素之后,开始输入多个操作命令(<200),对空的组队列进行操作,例如输入ENQUEUE 100,表示把元素100插入队列

输出

DEQUEUE出队的元素

输入样例

2
3 101 102 103
3 201 202 203
ENQUEUE 101
ENQUEUE 201
ENQUEUE 102
ENQUEUE 202
ENQUEUE 103
ENQUEUE 203
DEQUEUE
DEQUEUE
DEQUEUE
STOP

输出样例

101 102 103

提示

在这里插入图片描述
可以看到队列分组,先入队的组在队列中靠前,出队也靠前:

DEQUEUE 输出 201,队列变为 | 203 | 301 302 | 102 101 | …

题解

主要的是要注意输入进来的数要按照分组依据压进新的队列,而且是先进先出,而不是按之前的队列的分组进不同的位置,因为是队列,如果该元素不属于任何现有组,插入到最后一位

代码实现

#include <iostream>
#include <queue>
#include <vector>
using namespace std;int main()
{int t, i, n, j, item, num, f, k;string type;queue<int> myQA[10];   // 存储原始组vector<queue<int>> myQB;   // 用于按组存储已插入的元素cin >> t;f = 0; // 第一次DEQUEUE输出标志// 读取每个组的元素for (i = 0; i < t; i++){cin >> n;for (j = 0; j < n; j++){cin >> item;myQA[i].push(item);  // 将元素插入原始组}}while (cin >> type){if (type == "STOP"){break;}else if (type == "ENQUEUE"){cin >> num;bool inserted = false;// 遍历每个组,检查该元素是否属于该组for (i = 0; i < t; i++){queue<int> temp = myQA[i];  // 复制组队列while (!temp.empty()){if (temp.front() == num)  // 找到该元素所属的组{// 查找是否已经存在该组的队列for (auto& q : myQB) // 遍历myQB中的每个队列q{if (!q.empty() && q.front() == myQA[i].front()){q.push(num);    // 将元素插入对应组的队列inserted = true;break;}}}temp.pop();}if (inserted){break;}}// 如果该元素不属于任何现有组,插入到新的队列if (!inserted){queue<int> newGroupQueue;newGroupQueue.push(num);myQB.push_back(newGroupQueue);}}else if (type == "DEQUEUE"){k = 0;// 查找第一个非空队列并出队while (k < myQB.size() && myQB[k].empty()){k++;}if (k < myQB.size()){if (f == 0){cout << myQB[k].front(); // 首次输出f = 1; // 标记首次输出}else{cout << " " << myQB[k].front(); // 后续输出}myQB[k].pop(); // 出队// 如果队列已空,移除该队列if (myQB[k].empty()){myQB.erase(myQB.begin() + k);}}}}cout << endl;return 0;
}

id:50 D. DS队列----银行单队列多窗口模拟

题目描述

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

本题要求输出前来等待服务的N位顾客的平均等待时间、最长等待时间、最后完成时间。

输入

输入第1行给出正整数N(≤1000),为顾客总人数;随后N行,每行给出一位顾客的到达时间T和事务处理时间P,并且假设输入数据已经按到达时间先后排好了顺序;最后一行给出正整数K(≤10),为开设的营业窗口数。

输出

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

输入样例

9
0 20
1 15
1 61
2 10
10 5
10 3
30 18
31 25
31 2
3

输出样例

6.2 17 62

题解

  • 主要的思路是算好窗口的结束时间,知道结束时间后,就能算出等待时间
  • 最先初始化窗口的结束时间是0,然后列出每个人的开始办理的时间,完成办理的时间和等待时间,每列好一个人就更新等待时间
  • 主函数是,将输入进来的顾客到达时间和事务处理时间都压入队列,然后初始化窗口结束时间,接着执行操作,用一个循环找到结束时间最小的窗口号和最短的结束时间,如果这个顾客到达的时间大于等于窗口的最短结束时间,则表示不用等待,然后更新窗口的结束时间,如果顾客到达时间小于窗口的最短结束时间,则表示需要等待,则计算等待时间,并判断是否要更新最长等待时间,然后更新窗口的结束时间,最后遍历窗口的结束时间,找到最后完成时间,最后输出结果

代码实现

#include <iostream>
#include <queue>
#include <iomanip>
using namespace std;int main()
{int N, T, P, K, i, max, finish, min_k, m;double sum;queue<int> myQe;cin >> N;sum = 0.0; // 顾客总的等待时间max = 0; // 最长等待时间for (i = 0; i < N; i++){// 顾客的到达时间T和事务处理时间Pcin >> T >> P;myQe.push(T);myQe.push(P);}// 开设的营业窗口数cin >> K;int *arr = new int[K];// 初始化窗口结束时间都是0for (i = 0; i < K; i++){arr[i] = 0;}// 执行操作while (!myQe.empty()){min_k = 100;m = 0; // 窗口数// 找到结束时间最小的窗口for (i = 0; i < K; i++){if (min_k > arr[i]){min_k = arr[i]; // 最短结束时间m = i; // 此时窗口数}}// 顾客不用等待if (myQe.front() >= min_k){arr[m] = myQe.front(); // 更新窗口结束时间为开始时间myQe.pop(); // 到处理时间arr[m] += myQe.front(); // 更新窗口结束时间加上处理时间myQe.pop(); // 到下一个顾客}// 需要等待else{// 更新最长等待时间if (max < (min_k - myQe.front())){max = min_k - myQe.front();}sum += min_k - myQe.front(); // 减的是到达时间myQe.pop(); // 到处理时间arr[m] += myQe.front(); // 更新窗口结束时间加上处理时间myQe.pop(); // 到下一个顾客}}// 更新完全部的顾客,窗口结束时间,找到最后完成时间finish = 0;for (i = 0; i < K; i++){if (finish < arr[i]){finish = arr[i];}}cout << fixed << setprecision(1) << sum / N << " ";cout << max << " " << finish << endl << endl;delete[] arr;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Servlet详细讲解(一篇就够)

目录 一、Servlet 1.1 Servlet介绍 1.2 HTTP 1.2.1 在http请求中有请求报文 1.2.2 在http响应中有响应报文 1.3 GET和POST 1.3.1 GET 1.3.2 POST 二、第一个Servlet程序[重点] 2.1 创建web项目 2.2 pom依赖 2.3 编写Servlet 2.4 配置Servlet 2.5 部署项目 2.6 启…

C++进阶知识2 多态

多态 1. 多态的概念2. 多态的定义及实现2.1 多态的构成条件2.1.2 虚函数2.1.3 虚函数的重写/覆盖2.1.5 虚函数重写的⼀些其他问题2.1.6 override和final关键字2.1.7 重载/重写/隐藏的对⽐ 3. 多态的原理3.2 多态的原理3.2.1 多态是如何实现的3.2.2 动态绑定与静态绑定3.2.3 虚函…

PL/SOL 连接提示 Initialization error 解决方法

问题 测试连接数据库报错&#xff0c;提示如下 解决方法 1、OCI 库输入的时候&#xff0c;路径两遍有" " 2、Instant Client 和 PL/SOL Developer 位数版本不一致 要么都是x64位&#xff0c;要么都是x86位&#xff08;32位&#xff09;&#xff0c;以下为下载链接…

算力运力解决方案:构建未来智算新生态

中国联通国际有限公司产品之算力运力解决方案&#xff1a;构建未来智算新生态 在当今这个数据爆炸、技术日新月异的时代&#xff0c;算力已成为推动社会进步和产业升级的关键力量。中国联通国际有限公司紧跟时代步伐&#xff0c;依托其强大的网络资源和深厚的技术积累&#xf…

63.5 注意力提示_by《李沐:动手学深度学习v2》pytorch版

系列文章目录 文章目录 系列文章目录注意力提示生物学中的注意力提示查询、键和值注意力的可视化使用 show_heatmaps 显示注意力权重代码示例 代码解析结果 小结练习 注意力提示 &#x1f3f7;sec_attention-cues 感谢读者对本书的关注&#xff0c;因为读者的注意力是一种稀缺…

此连接非私人连接

当你手机浏览器输入网站打开提示“此连接非私人连接&#xff0c;此网站可能在冒充来窃取你的个人或财务信息。你应回到之前的页面”这是因为该网站的SSL数字证书到期导致&#xff0c;需要此网站的管理员重新申请数字证书替换之前的文件才可以实现。 注意&#xff1a;如果你不是…

java 洛谷题单【数据结构1-1】线性表

P3156 【深基15.例1】询问学号 解题思路 很简单的一道题&#xff0c;但是由于n、m的数据很大&#xff0c;要用Java的I/O流读入和输出。 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; impo…

二维数组的存放

今天我水的文章是二维数组的存放 二维数组的存放方式其实和一维数组没有区别&#xff0c;但如果想要更直观的了解&#xff0c;我们可以把它们的地址打印出来。 代码如下&#xff1a; #include <stdio.h> int main() {int arr[3][3];//二维数组&#xff0c;int数组类型…

企业级移动门户的多样化选择:为数字化转型赋能

在当今数字化转型的浪潮中&#xff0c;企业级移动门户&#xff08;Enterprise Mobile Portal&#xff09;被广泛应用于企业的日常运营中。它们为企业提供了一个集中、统一的移动应用与数据访问平台&#xff0c;帮助提升工作效率、增强实时沟通并改善员工体验。随着企业对灵活性…

Datawhale Leecode基础算法篇 task05:位运算

官方学习文档&#xff1a;datawhalechina 往期task01&#xff1a;枚举算法链接&#xff1a;Datawhale Leecode基础算法篇 task01&#xff1a;枚举算法 往期task02&#xff1a;递归算法and分治算法&#xff1a;Datawhale Leecode基础算法篇 task02&#xff1a;递归算法and分治…

STM32编码器接口笔记

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

【FaceFusion3.0.0】全新升级,重磅发布!

FaceFusion 3.0.0 版本引入了许多新特性和改进&#xff0c;其中包括&#xff1a; 重新设计架构&#xff0c;使所有操作都作为“任务”进行处理。在面部交换功能中引入像素增强(pixel boost)。向面部检测器添加多角度处理功能。引入年龄修正处理器(age modifier processor)。引…

Kafak入门技术详解

抱歉&#xff0c;没有太多的时间进行详细校对 目录 一、Kafka简介 1.消息队列 1.1为什么需要消息队列 1.2消息队列 1.3消息队列的分类 1.4P2P和发布订阅MQ的比较 1.5消息系统的使用场景 1.6常见的消息系统 2.Kafka简介 2.1简介 2.2设计目标 2.3 kafka核心的概念 二…

Grafana指标汉化

1、Grafana解压 目录 conf 2、找到&#xff1a;defaults.ini 3、打开defaults.ini &#xff0c;搜索&#xff1a;en-US 4.重新运行 &#xff1a;grafana-server.exe

js中的深拷贝与浅拷贝 手写深拷贝代码

1 什么是深拷贝和浅拷贝&#xff1f; 深拷贝和浅拷贝都是复制对象时常用的两种方式&#xff0c;区别在于对于嵌套对象的处理&#xff0c;浅拷贝只复制属性的第一层属性&#xff0c;双方修改嵌套对象将会互相影响。深拷贝会递归复制每一层的属性&#xff0c;修改任意一方互不影响…

谷歌地图 | 3D 地图新功能:开发更简单,体验更丰富

今年早些时候在 Google I/O 大会上推出了地图 JavaScript API 中的逼真 3D 地图。从那时起&#xff0c;谷歌地图一直受到大家对 3D 地图的热烈反响&#xff0c;并从中汲取了大量灵感。9月25日&#xff0c;谷歌地图宣布实验性 3D 地图迎来了重大更新&#xff0c;这将使开发者更轻…

深度学习模型可视化工具 Netron 使用教程

Netron 介绍 Netron 是一个用于可视化机器学习模型、深度学习模型、神经网络、图模型&#xff08;例如用于计算机视觉的 ONNX、Caffe、TensorFlow Lite、TensorFlow.js、Keras、Darknet、TVM、PyTorch、TorchScript、Core ML、ML.NET、NNEF、PaddlePaddle、OpenVINO、Arm NN等…

2024年9月25日--- Spring-IOC 1

一 Spring的概要 1.1 简介 Spring&#xff0c;春天的意思&#xff0c;意指给软件行业带来春天。2002年&#xff0c;Rod Jahnson首次推出了Spring框架雏形interface21框架。2004年3月24日&#xff0c;Spring框架以interface21框架为基础&#xff0c;经过重新设计&#xff0c;发…

广州数字孪生工业互联网可视化技术,赋能新型工业化智能制造工厂

在广州&#xff0c;特别是在工业互联网领域&#xff0c;数字孪生技术正逐步成为赋能新型工业化智能制造工厂的重要驱动力。数字孪生工业互联网技术的引入&#xff0c;不仅为传统制造业带来前所未有的变革&#xff0c;更为广州的工业发展注入新的活力与可能。 在智能制造工厂的…

Linux 基础IO(个人笔记)

Linux基础 IO 1.C文件IO操作1.1 hello.c写文件1.2 hello.c读文件1.3 stdin&stdout&stderr 2.系统文件I/O2.1 hello.c写文件2.2 hello.c读文件2.3 open函数介绍2.4 文件描述符 fd2.4.1 文件描述符的分配规则2.4.2 重定向2.4.3 dup2系统调用2.4.4 C文件结构体FILE2.4.5 C…