目录
5.2 队列
1.STL-queue
课上演示:
基本代码展示:
2. 队列的应用
例:约瑟夫问题 No. 2
题目描述:
思路提示:
代码展示:
例:猫狗收容所
题目描述:
代码表示:
蓝桥杯21年填空题
试题 A :空间
【问题描述】
【答案提交】
试题 B :卡片
【问题描述】
【答案提交】
试题 C :直线
【问题描述】
【答案提交】
试题 D :货物摆放
【问题描述】
【答案提交】
5.2 队列
1.STL-queue
课上演示:
基本代码展示:
#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
题目描述:
思路提示:
代码展示:
#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;
}
例:猫狗收容所
题目描述:
代码表示:
#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
,以便后续的处理和计算。