当前位置:   article > 正文

蓝桥杯2022年1月STEMA C++中级组编程真题解析_2022年1月蓝桥杯c++

2022年1月蓝桥杯c++

哈喽啊,好久不见朋友们,昨天蓝桥杯刚过去,趁着我题目还记着,来给你们讲一下

还是那句话,点赞关注加复制代码 \doge.

题目描述我只讲个大概!!!

第一题

题目

给你两个数a,b要求输出两数中较大的一个

解析

没错这是一道非常弱智的题目,我当时看到的时候给我震惊住了(第一次参加真没想到原来真的那么简单),这里给大家用多种方法解答

 方法一

库中自带函数版

  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int main(){
  5. int a,b;
  6. cin >> a >> b;
  7. cout << max(a, b);
  8. return 0;
  9. }

方法二

自己写函数版

  1. #include <iostream>
  2. using namespace std;
  3. int ma(int a, int b){
  4. if(a > b){
  5. return a;
  6. }
  7. return b;
  8. }
  9. int main(){
  10. int a,b;
  11. cin >> a >> b;
  12. cout << ma(a, b);
  13. return 0;
  14. }

方法三

if判断版

  1. #include <iostream>
  2. using namespace std;
  3. int main(){
  4. int a,b;
  5. cin >> a >> b;
  6. if(a > b){
  7. cout << a;
  8. }else{
  9. cout << b;
  10. }
  11. return 0;
  12. }

第二题

呦西家人们,有一位热心的大佬给我提供了题目,所以我来补上这道题了

据说这道题是字符串逆序输出

虽说感觉这么说有点不太好,但是的确感觉很简单,你可以采用字符串输入,也可以采用字符数组输入(反正输进去就完事了,你就是用int存问题都不大),然后倒着输出就好

这里提供字符串版本~

  1. #include <iostream>
  2. #include <math.h>
  3. using namespace std;
  4. int main(){
  5. string s;
  6. cin >> s;
  7. for(int i = s.size() - 1; i >= 0; i--){
  8. cout << s[i];
  9. }
  10. return 0;
  11. }

第三题

题目

给你10个数和一个数n,求10个数中相加小于等于n且最接近n的两数之和,如果不存在这样两个数就输出-1

解析

这题虽然没有第一题那么弱智,但也是比较简单的

直接双重for循环

  1. #include <iostream>
  2. using namespace std;
  3. int a[11];
  4. int main(){
  5. int n;
  6. for(int i = 1; i <= 10; i++){
  7. cin >> a[i];
  8. }
  9. cin >> n;
  10. int ans = -1;
  11. for(int i = 1; i < 10; i++){//这里一定要小于,不然后面会非法访问
  12. for(int j = i + 1; j <= 10; j++){//i+1防止重复计算
  13. int res = a[i] + a[j];//也不知道为什么这里一定要设一个变量记录,不然后面会有两个点不过
  14. if(res <= n && res > ans){
  15. ans = res;
  16. }
  17. if(ans == n){//优化,减少不必要的循环(虽说不优化也不会超时,但是优化是个好习惯
  18. cout << n;
  19. return 0;
  20. }
  21. }
  22. }
  23. cout << ans << endl;
  24. return 0;
  25. }

第四题

题目

给你n(n <= 10)个数,要求将这两个数分成两组后,每组数的和的差值尽可能的小

输出每组数的和,若不相同,大的在前,中间用空格隔开

解析

说实话,我当时看到这道题还懵逼了一下,怎么难度突然这么大,然后一看数据“昂 直接暴力”

所以这道题的方法当然就是递归

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int n, a[12],r1 = (int)1e9,r2;//r1 r2最终答案,初始化使差值最大
  4. void f(int st, int r3, int r4){//st已分配数量,r3 r4临时答案
  5. if(st == n){//已分配完
  6. if(abs(r3 - r4) < abs(r1 - r2)){//若有更优解则更新
  7. r1 = r3;
  8. r2 = r4;
  9. }
  10. return;//结束递归,防止陷入死循环
  11. }
  12. f(st + 1,r3 + a[st], r4);
  13. f(st + 1,r3, r4 + a[st]);
  14. }
  15. int main(){
  16. cin >> n;
  17. for(int i = 0; i < n; i++){
  18. cin >> a[i];
  19. }
  20. f(0,0,0);
  21. if(r1 > r2){
  22. cout << r1 << " " << r2;
  23. }else{
  24. cout << r2 << " " << r1;
  25. }
  26. return 0;
  27. }

这里其实很容易看出来可以做剪枝优化什么的,这个我就懒得讲了

第五题

题目

给你n(n <= 10)个男生和女生的身高,两两一组配对,要求男生升高不比女生矮,不符合要求的对数不能超过k,求有几种配对方案

解析

好吧这道题我第一反应就是回溯,然后就感觉会超时,接着一看数据范围,好吧根本不会

所以这题也还是暴力

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int a[11], b [11];//a男生,b女生
  4. bool v[11];//标记是否已经配对过
  5. int n, k;
  6. int ans =0;//最终方案数
  7. void f(int st, int x){//st已配对数量,x不符合要求对数
  8. if(x > k){//不符合要求对数超限
  9. return;
  10. }
  11. if(st == n){//全部都已配对
  12. ans++;
  13. return;
  14. }
  15. for(int i = 0;i < n; i++){//一个一个配过去
  16. if(!v[i]){//如果没有配对过
  17. if(a[st] < b[i]){//不符合要求
  18. v[i] = 1;//标记已配对
  19. f(st+1,x + 1);
  20. v[i] = 0;//回溯取消标记
  21. }else{//符合要求
  22. v[i] = 1;
  23. f(st + 1,x);
  24. v[i] = 0;
  25. }
  26. }
  27. }
  28. }
  29. int main(){
  30. cin >> n >> k;
  31. for(int i = 0; i < n; i++){
  32. cin >> a[i];
  33. }
  34. for(int i = 0; i < n; i++){
  35. cin >> b[i];
  36. }
  37. f(0,0);
  38. cout << ans << endl;
  39. return 0;
  40. }

总结

说实话我感觉蓝桥杯的选择题考的是真的范围很广(但编程大题也是真的弱智),五道大题三道暴力,真的没啥技术含量

感觉这个比赛就印证了一句话

暴力出奇迹,打表出省一

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/384910
推荐阅读
相关标签
  

闽ICP备14008679号