目录
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-1if(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;elsecard[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
,以便后续的处理和计算。