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

目录

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,以便后续的处理和计算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安防视频监控汇聚平台EasyCVR使用RTMP推流出现异常的原因排查与解决

AI视频智能分析/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff08;专网、内网、局域网、广域网、公网等&#xff09;&#xff0c;支持设备通过4G、5G、WIFI、有线等方式接入&#xff0c;并将设备进行统一集中接入与视频汇聚管理&#xff0c;经平台接入的视频流能实现多…

大数据开发 hadoop集群 2.hadoop框架入门

自从我学会了寻找&#xff0c;我就已经找到 ——史铁生 —— 24.3.10 内容简介 Hadoop入门&#xff1a; ①概念 ②环境准备 ③hadoop生产集群搭建 ④常见错误的解决方案 ①概念&#xff1a;1.Hadoop是什么 2.Hadoop发展历史 3.Hadoop…

【Linux】线程封装_互斥

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;线程封装Thread.cpp &#x1f449;&am…

骨传导耳机哪个牌子好?五大热门品质机型盘点,体验超赞!

在蓝牙耳机中&#xff0c;骨传导耳机凭借不入耳佩戴更健康等优点&#xff0c;迅速成为当下的热门款式&#xff0c;但随着骨传导耳机市场的品牌日渐增多&#xff0c;以及市场上不专业的骨传导耳机泛滥成灾的问题&#xff0c;有很多消费者在选择骨传导耳机的时候&#xff0c;都出…

【算法】Hash存储——开放寻址法

模拟散列表 维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个整数 x&#xff1b; Q x&#xff0c;询问整数 x是否在集合中出现过&#xff1b; 现在要进行 N次操作&#xff0c;对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&am…

代码随想录 贪心算法-中等题目-序列问题

376.摆动序列 376. 摆动序列 中等 如果连续数字之间的差严格地在正数和负数之间交替&#xff0c;则数字序列称为 摆动序列 。第一个差&#xff08;如果存在的话&#xff09;可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。 例如&#xff0c; [1, 7…

spring boot 访问 static public 目录下的静态资源报404解决办法

1.前提是你没有修改spring boot 默认拦截路径&#xff0c;跟默认访问资源的目录。 在idea 设置中 把 compiler 下的 Buid project automatically 勾选上

开源的java视频处理库介绍

本文将为您详细讲解 Java 开源的视频处理库&#xff0c;以及它们的特点、区别和应用场景。Java 社区提供了多种视频处理库&#xff0c;这些库可以帮助您在 Java 应用程序中实现视频的录制、编辑、转换和播放等功能。 1. JCodec 特点 - 基于 Java 的视频编解码库。 - 支…

ChatGpt只能看,但无法发送消息的解决办法

这几天发现chatgpt没法发送消息了,我以为是网络问题,又过了几天还是不能发,我以为是梯子的问题,可给我急坏了,于是我用无痕模式发现可以访问额. 但是无痕模式毕竟不是长久之计,于是找到了一个方法 1.首先把电脑缓存全清除了 第一种方法: 快捷键是 : ctrlshiftdel (这会吧浏览…

分支需求管理方式

此文为上一篇文章的后续 我们来回顾一下&#xff0c;现在&#xff0c;你的小组负责的系统&#xff0c;有主干分支&#xff0c;每次新的需求&#xff0c;你都从主干(formal)拉取分支(dev-日期-需求名)进行修改&#xff0c;自测通过后&#xff0c;合并至测试分支(test)进行提测&a…

Python高级二

一、异常 1、定义 异常是在程序执行过程中出现的错误或意外情况。当程序遇到异常时&#xff0c;它会中断当前的执行流程&#xff0c;并尝试找到相应的异常处理机制来解决问题。 2、常见异常类型 SyntaxError&#xff1a;语法错误&#xff0c;通常是代码书写不符合Python语法规则…

VSCode单机活动栏图标无法收起

如果活动栏为展开状态&#xff0c;单击活动栏图标可以正常收起&#xff0c;但无法通过再次单击打开&#xff0c;解决方案如下&#xff1a; 设置->工作台->外观&#xff1a; Activity Bar:Icon Click Behavior: 切换为默认的toggle

C++ 作业 24/3/11

1、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数&#xff08;要求使用C风格字符串完成&#xff09; #include <iostream>using namespace std;int main() {string str;cout << "please enter str:&…

【Flutter 面试题】如何理解Flutter中的Widget、State、Context ,他们是为了解决什么问题?

【Flutter 面试题】如何理解Flutter中的Widget、State、Context &#xff0c;他们是为了解决什么问题&#xff1f; 文章目录 写在前面解答补充说明完整代码示例运行结果如下详细说明 写在前面 &#x1f64b; 关于我 &#xff0c;小雨青年 &#x1f449; CSDN博客专家&#xff…

svg简单教程

推荐查看这个视频 一小时讲完SVG 简介 scalable 英 /ˈskeɪləbl/ 美 /ˈskeɪləbl/ adj. &#xff08;计算机&#xff09; 可扩展的&#xff1b;可改变大小的&#xff0c;可缩放的&#xff1b;可攀登的&#xff1b;可称量的&#xff1b;可去鳞的 vector 英 /ˈvektə/ 美…

CTP-API开发系列之五:SimNow环境介绍

CTP-API开发系列之五&#xff1a;SimNow环境介绍 CTP-API开发系列之五&#xff1a;SimNow环境介绍SimNow模拟测试环境第一套第二套登录关键字段可视化终端常见问题 CTP-API开发系列之五&#xff1a;SimNow环境介绍 如果你要研发一套国内期货程序化交易系统&#xff0c;从模拟测…

Valid8Proxy:一款功能强大的工作代理获取、验证和存储工具

关于Valid8Proxy Valid8Proxy是一款功能强大且用户友好的代理管理工具&#xff0c;该工具功能丰富&#xff0c;旨在帮助广大研究人员获取、验证和存储工作代理的相关信息。 无论你是需要用于网络资源爬取、网络数字匿名化还是测试网络安全的代理&#xff0c;Valid8Proxy都可以…

如何利用AWS CloudFront 自定义设置SSL

Amazon CloudFront 提供三种选项&#xff0c;可以加速整个网站并从 CloudFront 的边缘站点通过安全的 HTTPS 方式交付内容。除能够安全地从边缘站点交付内容外&#xff0c;您还可以配置 CDN 来使用针对源提取的 HTTPS 连接&#xff0c;这样您的数据就会实现从源到最终用户的端到…

OpenHarmony教程—语言基础类库

介绍 本示例集合语言基础类库的各个子模块&#xff0c;展示了各个模块的基础功能&#xff0c;包含&#xff1a; ohos.buffer (Buffer)ohos.convertxml (xml转换JavaScript)ohos.process (获取进程相关的信息)ohos.taskpool (启动任务池)ohos.uri (URI字符串解析)ohos.url (UR…

3、设计模式之工厂模式

工厂模式是什么&#xff1f;     工厂模式是一种创建者模式&#xff0c;用于封装和管理对象的创建&#xff0c;屏蔽了大量的创建细节&#xff0c;根据抽象程度不同&#xff0c;主要分为简单工厂模式、工厂方法模式以及抽象工厂模式。 简单工厂模式 看一个具体的需求 看一个…