王道机试C++第 5 章 数据结构二:队列queue和21年蓝桥杯省赛选择题Day32

news2024/12/25 23:52:59

目录

5.2 队列

1.STL-queue

课上演示:

基本代码展示:

2. 队列的应用

例:约瑟夫问题 No. 2

题目描述:

思路提示:

代码展示:

例:猫狗收容所

题目描述:

代码表示:

蓝桥杯21年填空题

试题 A :空间

【问题描述】

【答案提交】

试题 B :卡片

【问题描述】

【答案提交】

试题 C :直线

【问题描述】

【答案提交】

试题 D :货物摆放

【问题描述】

【答案提交】


5.2 队列

队列( Queue )是一种线性的序列结构,其存放的元素按照线性的逻辑次序排列,但与一般的线性序列结构如数组或向量相比,队列的操作只限于逻辑上的两端,即新元素只能从队列
一端插入,并且只能从另一端删除已有的元素。
允许队列插入的一端称为队列的尾部,允许队列删除的一端称为队列的头部。因此,对于元素说,插入与删除就分别称为入队和出队。
遵守所谓的先进先出 First-In First-Out, FIFO )规则,即越早入队的元素将会越早出队,而越晚入队的元素将会越晚出队。

1STL-queue

在正式介绍队列的应用之前,先介绍标准库中的队列模板。对于队列模板,读者不必过多
地关注其实现细节,掌握其在程序中的用法即可。
1 queue 的定义
要使用 queue 标准模板,就应在代码中添加头文件,其格式为 #include <queue> 。定义一个队列 queue 的写法是 queue<typename> name ,其中 typename 是队列元素的类型,它可以是任意数据类型,name 是所定义队列的名字。
2 queue 的状态
queue 中常用作判断的状态有两个:一个是返回当前队列是否为空的 empty() ,另一个是返回当前队列元素个数的 size()
3 queue 元素的添加或删除
定义一个队列后,如果要向其中添加新的元素push()删除已有的元素 pop()
4 queue 元素的访问
只能对队列的头尾两端进行操作,获得头front()  尾back()。
课上演示:
基本代码展示:
#include <bits/stdc++.h>
using namespace std;

int main() {  
    queue<int> myQueue; // 定义并初始化一个整型队列  
  
    // 输出队列初始大小  
    printf("the size of myQueue: %zu\n", myQueue.size());  
  
    for (int i = 0; i < 10; ++i) {  
        myQueue.push(i); // 将元素推入队列  
    }  
  
    // 输出队列的前端和后端元素  
    printf("the front of myQueue: %d\n", myQueue.front());  
    printf("the back of myQueue: %d\n", myQueue.back());  
  
    // 输出队列当前大小  
    printf("the size of myQueue: %zu\n", myQueue.size());  
  
    int sum = 0;  
    while (!myQueue.empty()) {  
        sum += myQueue.front(); // 累加队列前端元素  
        myQueue.pop(); // 弹出队列前端元素  
    }  
  
    // 输出累加和  
    printf("sum: %d\n", sum);  
  
    //再次检查是否为空  
     if (myQueue.empty()) {  
         printf("myQueue is empty\n");  
    }  
  
    // 输出队列最终大小(应该是0)  
    printf("the size of myQueue: %zu\n", myQueue.size());  
  
    return 0;  
}

2. 队列的应用

例:约瑟夫问题 No. 2
题目描述:
n 个小孩围坐成一圈,并按顺时针编号为 1, 2,... , n ,从编号为 p 的小孩顺时针依次报数,由 1
m ,报到 m 时,这名小孩从圈中出去;然后下一名小孩再从 1 报数,报到 m 时再出去。以此
类推,直到所有小孩都从圈中出去。请按出去的先后顺序输出小孩的编号。
输入: 第一个是 n ,第二个是 p ,第三个是 m 0 < m , n < 300 )。
           最后一行是:0 0 0
输出: 按出圈的顺序输出编号,编号之间以逗号间隔。
样例输入:
8 3 4
0 0 0
样例输出:
6,2,7,4,3,5,1,8
思路提示:

代码展示:
#include <bits/stdc++.h>
using namespace std;

int main() {  
    int n,p,m;
    while(true){
    	scanf("%d%d%d",&n,&p,&m);
    	if(n==0&&p==0&&m==0){
    		break;
		}
		
//1、排队 
		//队列中的元素是孩子的编号 
		queue<int>children;
//把第一轮要喊编号的孩子排好队 
//i遍历孩子的编号,j记录已经遍历的孩子数量 
		for(int i=p,j=0;j<n;++j){
			children.push(i);
			++i;//p ->p+1 ->p+2 ->..n ->1 ->...->p-1
			if(i>n){
				i=1;
			}
		}
	}
	
//2、喊号过程 
	int num=1;//将要喊的号
	while(true){
	    int cur=children.front();//cur是队首孩子的编号
		children.pop();
		if(num==m){//检查刚才喊得号是不是1 
			num=1;//下一个就是1
			//喊号的同学不需要归队
			if(children.empty()){
				printf("%d\n",cur);
				break;
			}else{
				//还有同学在喊号
				printf("%d",cur);
			}
		}	
	} else{
		//喊得号码不是m,归队
		num=num+1; 
		children.push(cur); 
	}
    return 0;  
}

例:猫狗收容所
题目描述:
有家动物收容所只收留猫和狗,但有特殊的收养规则。收养人有两种收养方式:
第一种为直接收养所有动物中最早进入收容所的。
第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的。给定一个操作序列代表所有事件。
若第一个元素为 1 ,则代表有动物进入收容所。第二个元素为动物的编号,正数代表狗,负数代表猫。
若第一个元素为 2 ,则代表有人收养动物。第二个元素若为 0 ,则采取第一种收养方式;若为 1, 则指定收养狗;若为-1 ,则指定收养猫。请按顺序输出收养动物的序列。
若出现不合法的操作,即没有可以符合领养要求的动物,则将这次领养操作忽略。
输入: 第一个是 n ,它代表操作序列的次数。接下来是 n 行,每行有两个值 m t ,分别代表题目中操作的两个元素。
输出:按顺序输出收养动物的序列,编号之间以空格间隔。
样例输入:
6
1 1
1 -1
2 0
1 2
2 -1
2 1
样例输出:
1 -1 2
代码表示:
#include <bits/stdc++.h>
using namespace std;

// 定义动物结构体  
struct animal {  
    int num; // 动物编号  
    int seq;  // 次序标志  
    animal(int n, int o) : number(n), order(o) {} // 构造函数  
};  
  
int main() {  
    queue<animal> catque; // 猫的队列  
    queue<animal> dogque; // 狗的队列  
    int n;  
    int seq = 0;  
    scanf("%d",&n); // 输入动物数量  
    for (int i = 0; i < n; ++i) {  
        int method, pare;  
        scanf("%d%d",&method,&pare)// 输入操作方法和动物类型  
        if (method == 1) {  
            // 入队操作  
            if (pare > 0) 
			{ 
			//操作狗
			animal dog;
			dog.num=para;
			dog.seq=seq; 
			++seq;
            dogque.push(dog);
            } else 
			{ 
			animal cat;
			cat.num=para;
			cat.seq=seq; 
			++seq;
            catque.push(dog); 
            }  
        } 
		else 
		{  
            // 出队操作  
            if (pare == 0 && !dogque.empty() && !catque.empty()) {  
                // 猫和狗都不为空,比较次序出队  
                if (dogque.front().pare < catque.front().pare) {  
                    cout << dogque.front().number << " ";  
                    dogque.pop();  
                } else {  
                    cout << catque.front().number << " ";  
                    catque.pop();  
                }  
            } else if (pare == 0 && dogque.empty() && !catque.empty()) {  
                // 狗为空,只有猫,出队猫  
                cout << catque.front().num << " ";  
                cats.pop();  
            } else if (pare== 0 && !dogque.empty() && catque.empty()) {  
                // 猫为空,只有狗,出队狗  
                cout << dogque.front().num << " ";  
                dogs.pop();  
            } else if (pare == 1 && !dogque.empty()) {  
                // 只出队狗  
                cout << dogque.front().num<< " ";  
                dogs.pop();  
            } else if (pare== -1 && !catque.empty()) {  
                // 只出队猫  
                cout << catque.front().num<< " ";  
                catque.pop();  
            }  
        }  
    }  
    cout << endl; // 输出换行符  
    return 0;  
}

蓝桥杯21年填空题

试题 A :空间

【问题描述】

小蓝准备用256MB 的内存空间开一个数组,数组的每个元素都是 32 位二进制整数,如果不考虑程序占用的空间和维护内存需要的辅助空间,请问256MB 的空间可以存储多少个32 位二进制整数?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

答:相当于一道计组的题2^28/2^2,再用pow(2,26);

6.71089e+007


试题 B :卡片

【问题描述】

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9 。

小蓝准备用这些卡片来拼一些数,他想从1开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 30张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10 ,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11 。

现在小蓝手里有 0 到 9 的卡片各 2021 张,共20210 张,请问小蓝可以从 1 拼到多少?

提示:建议使用计算机编程解决问题。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

3181(短代码+word不容易呀,菜就得练┭┮﹏┭┮)

代码:

#include <bits/stdc++.h>
using namespace std;

int card[10];  
bool check(int num)
{
	while (num)
	{
		int a = num % 10;
		if (a == 1)
			if (card[1] == 0)
				return false;
			else
				card[1]--;
		num = num / 10;
	}
	return true;
}
int main()
{
	for (int i = 0; i <= 9; i++)
	{
		card[i] = 2021;
	}
	for (int i = 1;check(i); i++)
	{
		cout << i << endl;
	}
	return 0;
}

试题 C :直线

【问题描述】

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

目前还不会!!之后搞懂!


试题 D :货物摆放

【问题描述】

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

代码部分

#include <bits/stdc++.h>
using namespace std;

int main()
{
   long long num=2021041820210418;
   vector<long long> divisor;
   for(long long i=1;i<=sqrt(num);i++){
     if(num%i==0){
       divisor.push_back(i);
       long long j=num/i;
    //避免将重复的因子添加到divisor向量中
       if(j!=i){
         divisor.push_back(j);//如果是因子就将因子压入因子容器里
       }
     }
   }
   int count=0;//设置好题解是count初值为0
//设置三个迭代器遍历因子容器找三个因子相乘就是num的组合,答案就在这些组合里面
   vector<long long>::iterator a,b,c;
   for(a=divisor.begin();a!=divisor.end();a++){
     for(b=divisor.begin();b!=divisor.end();b++){
       for(c=divisor.begin();c!=divisor.end();c++){
         if((*a)*(*b)*(*c)==num){
           count++;
         }
       }
     }
   }
   cout<<count<<endl;
   return 0;
 }

心得体会:

int main()
{
   long long num=2021041820210418;
   vector<long long> divisor;
   for(long long i=1;i<=sqrt(num);i++){
     if(num%i==0){
       divisor.push_back(i);
       long long j=num/i;
       if(j!=i){
         divisor.push_back(j);//如果是因子就将因子压入因子容器里
       }
     }
   }

对于这段代码是用于计算给定的数num的因子。

首先,使用一个for循环来遍历从1到num的平方根之间的整数,即i * i <= num。这是因为一个数的因子不会超过它的平方根。

在循环中,通过判断num是否能被i整除来确定i是否是num的因子。如果num能被i整除,即num % i == 0,则将i添加到因子容器divisor中。

接下来,使用变量j存储num除以i的结果,即j = num / i。然后,通过判断j是否等于i,来避免将重复的因子添加到divisor中。如果j不等于i,则将j也添加到divisor中。

经过循环遍历后,divisor中存储了num的所有因子,这段代码的目的是为了生成一个包含num所有因子的容器divisor,以便后续的处理和计算。

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

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

相关文章

【深度学习】线性回归

Linear Regression 一个例子线性回归机器学习中的表达评价函数好坏的度量&#xff1a;损失&#xff08;Loss&#xff09;损失函数&#xff08;Loss function&#xff09;哪个数据集的均方误差 (MSE) 高 如何找出最优b和w?寻找最优b和w如何降低损失 (Reducing Loss)梯度下降法梯…

【毕设级项目】基于AI技术的多功能消防机器人(完整工程资料源码)

基于AI技术的多功能消防机器人演示效果 竞赛-基于AI技术的多功能消防机器人视频演示 前言 随着“自动化、智能化”成为数字时代发展的关键词&#xff0c;机器人逐步成为社会经济发展的重要主体之一&#xff0c;“机器换人”成为发展的全新趋势和时代潮流。在可预见的将来&#…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《计及台区资源聚合功率的中低压配电系统低碳优化调度方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

软件无线电系列——软件无线电的发展历程及体系框架

本节目录 一、软件无线电的起始 二、软件无线电SDR论坛 三、SPEAKeasy计划 四、JTRS与SCA 五、软件无线电体系框架本节内容 一、软件无线电的起始 1992年5月&#xff0c;美国电信会议上&#xff0c;Joseph Mitola III博士提出来软件无线电(Software Radio,SR)的概念。理想化的…

实现支持多选的QComboBox

Qt提供的QComboBox只支持下拉列表内容的单选&#xff0c;但通过QComboBox提供的setModel、setView、setLineEdit三个方法&#xff0c;可以对QComboBox进行改造&#xff0c;使其实现下拉列表选项的多选。 QComboBox可以看作两个组件的组合&#xff1a;一个QLineEdit和一个QList…

OpenCV开发笔记(七十七):相机标定(二):通过棋盘标定计算相机内参矩阵矫正畸变摄像头图像

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136616551 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 红胖子(红模仿)的博…

Orange3数据预处理(预处理器组件)

1.组件介绍 Orange3 提供了一系列的数据预处理工具&#xff0c;这些工具可以帮助用户在数据分析之前准备好数据。以下是您请求的预处理组件的详细解释&#xff1a; Discretize Continuous Variables&#xff08;离散化连续变量&#xff09;&#xff1a; 这个组件将连续变量转…

利用Nginx正向代理实现局域网电脑访问外网

引言 在网络环境中&#xff0c;有时候我们需要让局域网内的电脑访问外网&#xff0c;但是由于网络策略或其他原因&#xff0c;直接访问外网是不可行的。这时候&#xff0c;可以借助 Nginx 来搭建一个正向代理服务器&#xff0c;实现局域网内电脑通过 Nginx 转发访问外网的需求…

算法(结合算法图解)

算法简介简单查找二分查找法 选择排序内存的工作原理数组和链表数组选择排序小结 递归小梗 要想学会递归&#xff0c;首先要学会递归。 递归的基线条件和递归条件递归和栈小结 快速排序分而治之快速排序合并排序时间复杂度的平均情况和最糟情况小结 算法简介 算法是一组完成任…

Python3虚拟环境之virtualenv

virtualenv 在开发Python应用程序的时候&#xff0c;系统安装的Python3只有一个版本&#xff1a;3.7。所有第三方的包都会被pip安装到Python3的site-packages目录下。 如果要同时开发多个应用程序&#xff0c;这些应用程序都会共用一个Python&#xff0c;就是安装在系统的Pyt…

【算法】一维前缀和以及二维前缀和

目录 一维前缀和适用场景示例 二维前缀和适用场景一种情况另一种情况示例 一维前缀和 适用场景 求一段区间的和。 比如有一个数列 &#xff1a; 如果我们要求 [l,r]即某个区间内的数组和的时候&#xff0c;思路就是每遍历一个元素就进行求和&#xff0c;记录下加到al时的和…

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配手机和PC…

Java双非大二找实习记录

先说结论&#xff1a;2.22→3.6线上线下面了七家&#xff0c;最后oc两家小公司&#xff0c;接了其中一个。 本人bg&#xff1a; 真名不经传双非一本&#xff0c;无绩点无竞赛无奖项无实习&#xff0c;23年12月开始学java。若非要说一点相关的经历&#xff0c;就是有java基础&…

python-0003-pycharm开发虚拟环境中的项目

前言 在虚拟环境中创建好了python项目&#xff0c;使用pycharm进行开发 打开项目 使用pycharm打开项目 设置虚拟环境的解释器 File–>Settings–>Project(项目名)–>Python Interpreter–>添加解释器–>添加已经存在的解释器–>选择虚拟环境的解释器 …

程序人生——Java开发中通用的方法和准则,Java进阶知识汇总

目录 引出Java开发中通用的方法和准则建议1:不要在常量和变量中出现易混淆的字母建议2:莫让常量蜕变成变量建议3:三元操作符的类型务必一致建议4:避免带有变长参数的方法重载建议5:别让null值和空值威胁到变长方法建议6:覆写变长方法也循规蹈矩建议7:警惕自增的陷阱建议…

linux查看文件内容cat,less,vi,vim

学习记录 目录 catlessvi vim cat 输出 FILE 文件的全部内容 $ cat [OPTION] FILE示例 输出 file.txt 的全部内容 $ cat file.txt查看 file1.txt 与 file2.txt 连接后的内容 $ cat file1.txt file2.txt为什么名字叫 cat&#xff1f; 当然和猫咪没有关系。 cat 这里是 co…

Python 导入Excel三维坐标数据 生成三维曲面地形图(面) 4-2、线条平滑曲面(原始颜色)但不去除无效点

环境和包: 环境 python:python-3.12.0-amd64包: matplotlib 3.8.2 pandas 2.1.4 openpyxl 3.1.2 scipy 1.12.0 代码: import pandas as pd import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D from scipy.interpolate import griddata fr…

未来城市:数字孪生技术助力智慧城市构建

目录 一、数字孪生技术的兴起与定义 二、数字孪生技术在智慧城市构建中的应用 1、城市规划与管理 2、智慧交通 3、智慧能源 4、智慧环保 三、数字孪生技术助力智慧城市构建的挑战与对策 四、结语 随着科技的飞速发展&#xff0c;未来城市正在经历一场前所未有的变革。数…

Redis 的 key 的过期策略是怎么实现的【经典面试题】

前言 在 Redis 中可以通过命令 expire 对指定的 key 值设置过期时间&#xff0c;在时间到了以后该键值对就会自动删除。 一个 Redis 中可能会存在很多的 key &#xff0c;而这些 key 中有很大的一部分都会有过期时间&#xff0c;那么 Redis 怎么知道哪些 key 已经到了过期时间需…

【C语言】InfiniBand驱动mlx4_register_interface函数

一、讲解 mlx4_register_interface函数是Mellanox InfiniBand驱动程序的一部分&#xff0c;这个函数的作用是注册一个新的接口(intf)到InfiniBand设备。这允许不同的子系统&#xff0c;如以太网或存储&#xff0c;能够在同一个硬件设备上注册它们各自需要的接口&#xff0c;在…