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