第十二届蓝桥杯C++青少年组中/高级组选拔赛2020年11月22日真题解析

一、编程题

第1题:求和

【题目描述】
输入一个正整数 N(N < 100),输出 1 到 N(包含 1 和 N)之间所有奇数的和。
【输入描述】
输入一个正整数 N(N < 100)
【输出描述】
输出 1 到 N 之间的所有奇数的和

【输入样例】

3

【输出样例】

4

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  int sum = 0;
  for (int i = 1; i <= n; i++) {
    if (i % 2 == 1) {
      sum += i;
    }
  }
  cout << sum << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  int sum = 0;
  for (int i = 1; i <= n; i += 2)
    sum += i;
  cout << sum;
  return 0;
}

本题属于简单题,考察累加器和循环的使用。定义累加器 sum 并初始化为 0,循环枚举i从1到 n,判断i如果为奇数,则累加 sum+=ì。循环结束后输出 sum。对循环理解较好的同学,也可以去掉 ǐ 判断,将 i++改为i+= 2,直接累加,也可达到奇数求和的效果。

第2题:求平方

【题目描述】
平方是一种运算,比如:a 的平方表示 a × a。
例如:2 的平方为 4(也就是 2*2 的积)
例如:4 的平方为 16(也就是 4*4 的积)
输入一个正整数 N(N < 30),输出 1 到 N(包含 1 和 N)之间所有正整数的平方,且所输出的平方数之间以英文逗号隔开。
【输入描述】
输入一个正整数 N(N < 30)
【输出描述】
输出所有正整数的平方数,以英文逗号隔开

【输入样例】

3

【输出样例】

1,4,9

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cout << i * i;
    if (i != n) {
      cout << ",";
    }
  }
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  cout << "1";
  for (int i = 2; i <= n; i++)
    cout << ',' << i * i;
  return 0;
}

本题属于简单题,考察循环的使用。大部分失分的同学主要错在输出格式上。题目中要求输出时用英文逗号隔开,不能加空格或者使用中文逗号,并且最后一个平方数后面不能有英文逗号,因此在循环输出时,判断循环变量i,如果不是输出最后一个数,则输出英文逗号””,否则不输出。

第3题:数位递增数

【题目描述】
一个正整数如果任何一个数位小于等于右边相邻的数位,则称为一个数位递增数。
例如:
1135 是一个数位递增数
1024 不是一个数位递增数
输入一个正整数 n(11<n<10001),输出 11 到 n(包含11和n)中有多少个数位递增数。
例如:输入 15,11 到 15 之间的数位递增数有:11、12、13、14、15。一共有 5 个。
【输入描述】
输入一个正整数 n(11<n<10001)
【输出描述】
输出 11 到 n 中有多少个数位递增数

【输入样例】

15

【输出样例】

5

答案:
参考代码一:

#include <iostream>
using namespace std;
int main() {
  int n;
  cin >> n;
  int cnt = 0;
  for (int i = 11; i <= n; i++) {
    int a = i / 10000 % 10; // 万位
    int b = i / 1000 % 10;  // 千位
    int c = i / 100 % 10;   // 百位
    int d = i / 10 % 10;    // 十位
    int e = i % 10;         // 个位
    if (a <= b && b <= c && c <= d && d <= e) {
      cnt++;
    }
  }
  cout << cnt << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n;
int main() {
  cin >> n;
  int sum = 0;
  for (int i = 11; i <= n; i++) {
    string s;
    stringstream ss;
    ss << i;
    ss >> s;
    int f = 0;
    for (int j = 1; j <= s.size() - 1; j++)
      if (s[j] < s[j - 1]) {
        f = 1;
        break;
      }
    if (!f)
      sum++;
  }
  cout << sum;
  return 0;
}

本题与之前课上所做的水仙花数、四叶玫瑰数类似,考察循环枚举与数位分离的技巧。
题目中的数据范围为 11~10001,即最少为2位,最多为5位。由题意可知,一个数位递增数,在高位补0后,不会改变数的大小且仍为数位递增数。不妨在高位补 0,将所有的数当做五位数处理。例如,11、12 是数位递增数,处理时看做 00011、00012,仍为数位递增数。补齐五位后,使用数位分离的技巧,依次取出万位 a、千位 b、百位 c、十位 d、个位 e,判断是否高位数字<= 低位数字,如果是数位递增数,则计数器 cnt++,循环结束后输出 cnt,程序结束.

第4题:最短距离

【题目描述】
有一个居民小区的楼房全是一样的,并且按矩阵样式排列。其楼房的编号为 1,2,3……,当排满一行时,从下一行相邻的楼往反方向排号。
例如:小区为 3 行 6 列,矩阵排列方式:
在这里插入图片描述

要求:已知小区楼房有 w 列及两个楼房楼号 m 和 n,求从 m 号楼到 n 号楼之间的最短路线经过几个楼(不能斜线方向移动)。
例如上图:当 w=6,m=8,n=2,从 8 号楼到 2 号楼最短的路线经过 5,4,3,2 四个楼(9,10,11,2 也经过四个楼),故最短路线为 4(注:不考虑路线只考虑最短路线经过几个楼)。
输入三个正整数 w(1<w<21),m(1<m<10001),n(1<n<10001),且 m 不等于n。三个正整数之间以一个空格隔开,输出m 到n的最短路线经过几个楼。
【输入描述】
在一行输入三个正整数 w,m,n,三个正整数之间以一个空格隔开
【输出描述】
输出 m 到 n 的最短路线经过几个楼
【输入样例】

6 8 2

【输出样例】

4

答案:
参考代码一:

#include <cmath>
#include <iostream>

using namespace std;
int main() {
  int w, m, n;
  cin >> w >> m >> n;
  int x1, y1, x2, y2;
  x1 = (m - 1) / w + 1;
  y1 = (m - 1) % w + 1;
  if (x1 % 2 == 0) {
    y1 = w + 1 - y1;
  }
  x2 = (n - 1) / w + 1;
  y2 = (n - 1) % w + 1;
  if (x2 % 2 == 0) {
    y2 = w + 1 - y2;
  }
  int ans = abs(x1 - x2) + abs(y1 - y2);
  cout << ans << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n, m, w, a[1011][1011], s1, t1, s2, t2;
int main() {
  cin >> w >> n >> m;
  int x = 1, y = 1, f = 0;
  if (n > m)
    swap(n, m);
  for (int i = 1; i <= m; i++) {
    a[x][y] = i;
    if (i == n)
      s1 = x, t1 = y;
    if (i == m)
      s2 = x, t2 = y;
    if (f == 0)
      y++;
    else
      y--;
    if (y > w) {
      x++;
      y = w;
      f = 1;
    }
    if (y < 1) {
      x++;
      y = 1;
      f = 0;
    }
  }
  cout << abs(s2 - s1) + abs(t2 - t1);
  return 0;
}

本题重点考察题目分析和理解。我们需要计算出 m、n 号楼在第几行第几列,行、列的差相加,得到最终的结果。
例如,w=6,m=8,n=2,可以算得8号楼所在行x1=(m-1)/w+1=(8-1)16+1=2,2号楼所在行x2=(n-1)/w+1=(2-1)16+1=1:
所在列的情况比较复杂,涉及反向的问题,其中奇数行的列号从左往右依次增大,偶数行的列号从左往右依次减小,我们可以先按照从左往右依次增大的情况,算出y1=(m-1)%w+1=(8-1)%6+1=2,y2=(n-1)%w+1=(2-1)%6+1=2:
其中,2号楼在奇数行,y2=2即为所在列,8号楼在偶数行,方向相反,y1=w+1-y1=6+1-2=5,8号楼在第5列。
经过的楼数为 abs(x1-x2)+abs(y1-y2)=abs(2-1)+ abs(5-2)= 4.
将如上过程编写为程序,输出即可。

第5题:组合

【题目描述】
输入两个正整数 n 和 m(20 >= m >= n > 0),n 代表正整数的个数,要求 n 个正整数相加的和为 m,输出满足这个条件的正整数组合有多少。
例如:当 n=4,m=8 时,满足条件的有 5 组(也就是:5+1+1+1=8,4+2+1+1=8,3+3+1+1=8,3+2+2+1=8,2+2+2+2=8,每组组合都由 4 个正整数组成且 4 个正整数的和等于 8)
【输入描述】
分行输入 n 和 m(20>=m>=n>0)
【输出描述】
输出满足这个条件的正整数组合有多少
【输入样例】

4
8

【输出样例】

5

答案:
参考代码一:

#include <iostream>
using namespace std;
int n, m, sum = 0, ans = 0;
int a[25];
void dfs(int p) {
  if (p > n) {
    if (sum == m) {
      ans++;
    }
    return;
  }
  for (int i = a[p - 1]; i <= m - sum; i++) {
    sum += i;
    a[p] = i;
    dfs(p + 1);
    sum -= i;
    a[p] = 0;
  }
}
int main() {
  cin >> n >> m;
  a[0] = 1;
  dfs(1);
  cout << ans << endl;
  return 0;
}

参考代码二:

#include <bits/stdc++.h>
using namespace std;
int n, m, a[110], ans;
void dfs(int dps, int sum) {
  if (sum > m)
    return;
  if (dps > n) {
    if (sum == m)
      ans++;
  } else {
    for (int i = 1; i <= m; i++) {
      if (i >= a[dps - 1]) {
        a[dps] = i;
        dfs(dps + 1, sum + i);
        a[dps] = 0;
      }
    }
  }
  return;
}
int main() {
  cin >> n >> m;
  dfs(1, 0);
  cout << ans;
  return 0;
}

做法1使用递归回溯法,设数组 a[25],a[p] 表示式子中的第 p 个加数。
设初始值 a[0]= 1,依次递归枚举 a[1]~ a[n],为了避免重复枚举,a[p]的枚举范围为 a[p-1]~(m- sum)。
计算 a[1] ~ a[n] 总和 sum,如果 sum == m,则个数 ans++。
递归结束,输出符合条件的个数 ans。

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

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

相关文章

探索 Noisee AI 的奇妙世界与变现之旅

日赚800&#xff0c;利用淘宝/闲鱼进行AI音乐售卖实操 如何让AI生成自己喜欢的歌曲-AI音乐创作的正确方式 抖音主播/电商人员有福了&#xff0c;利用Suno创作产品宣传&#xff0c;让产品动起来-小米Su7 用sunoAI写粤语歌的方法&#xff0c;博主已经亲自实践可行 五音不全也…

使用 Elasticsearch 调用 OpenAI 函数

作者&#xff1a;来自 Elastic Ashish Tiwari 介绍 OpenAI 中的函数调用是指 AI 模型与外部函数或 API 交互的能力&#xff0c;使它们能够执行文本生成之外的任务。此功能使模型能够通过调用预定义函数来执行代码、从数据库检索信息、与外部服务交互等。 该模型根据用户提示智…

玩转ChatGPT:最全学术论文提示词分享【中】

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 本篇文章&#xff0c;我们继续为大家分享「最全学术论文提示词【中】」。上篇文章的内容请到文末链接处跳转&#x1f447;&#x1f3fb; 6.数据分析 prompt 1&#xff1a;分析[定量/定…

内存管理--4.用幻灯片讲解内存分配器Allocator

用幻灯片讲解内存分配器Allocators Allocators 内存分配器 提供内存分配策略的通用接口委托给 C 运行时&#xff1a;new / delete使用块内存池管理内存使用不同大小的块内存池管理内存 为什么用分配器? 将容器逻辑与内存分配策略解耦速度&#xff1a;内存分配速度慢确保…

YOLOv8改进 | 卷积模块 | 在主干网络中添加/替换蛇形卷积Dynamic Snake Convolution

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 蛇形动态卷积是一种新型的卷积操作&#xff0c;旨在提高对细长和弯曲的管状结构的特征提取能力。它通过自适应地调整卷积核的权重&#xff0…

D455相机RGB与深度图像对齐,缓解相机无效区域的问题

前言 上一次我们介绍了深度相机D455的使用&#xff1a;intel深度相机D455的使用-CSDN博客&#xff0c;我们也看到了相机检测到的无效区域。 在使用Intel深度相机D455时&#xff0c;我们经常会遇到深度图中的无效区域。这些无效区域可能由于黑色物体、光滑表面、透明物体以及视…

Redis中的主从复制

分布式系统中的几种Redis部署方式 为了解决一个程序只部署在一个服务器上的单点问题&#xff1a; 可用性问题&#xff0c;如果这个机器挂了&#xff0c;就意味着服务就中断了 一个程序只部署在一台机器上&#xff0c;它的性能/支持的并发量也是有限的 所以&#xff0c;就引…

若依原生框架集成mybatisplus

1、进入父级依赖 将这个阿里数据库连接池druid注释掉&#xff0c;然后将pagehelper排除jsqlparser分页&#xff0c;使用mybatisplus分页查询防止mybatisplus与pagehelper版本不匹配&#xff0c;不然会报错 2、进入disease-framework模块&#xff1a; config的下面DruidConf…

【python】OpenCV—Blob Detection(11)

学习来自OpenCV基础&#xff08;10&#xff09;使用OpenCV进行Blob检测 文章目录 1、cv2.SimpleBlobDetector_create 中文文档2、默认 parameters3、配置 parameters附录——cv2.drawKeypoints 1、cv2.SimpleBlobDetector_create 中文文档 cv2.SimpleBlobDetector_create 是 O…

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树&#xff0c;只是在其基础上增加了平衡的要求&#xff0c;也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

外卖APP与外卖小程序开发:从源码到上线的全流程

本文&#xff0c;小编将详细介绍外卖系统与小程序开发的全过程&#xff0c;从源码的编写到系统的上线&#xff0c;为开发者提供全面的指导。 一、需求规划 用户需要一个简单易用的点餐界面&#xff0c;商家需要管理菜单、订单和配送&#xff0c;后台管理则需要监控系统运行状况…

韩顺平0基础学java——第19天

p396-406 final关键字 1.final修饰的为“常量”&#xff0c;需要给初始值。1可以直接定义时赋值&#xff0c;2在构造器中&#xff0c;3在代码块中。 注意静态代码块只能访问静态变量。 2.如果final修饰的关键字是静态的&#xff0c;那就不能在构造器中赋值&#xff0c;只能…

linux经典例题编程

编写Shell脚本&#xff0c;计算1~100的和 首先vi 1.sh,创建一个名为1.sh的脚本&#xff0c;然后赋予这个脚本权限&#xff0c;使用命令chmod 755 1.sh&#xff0c;然后就可以在脚本中写程序&#xff0c;然后运行。 shell脚本内容 运行结果&#xff1a; 编写Shell脚本&#xf…

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…

Polar Web【中等】反序列化

Polar Web【中等】反序列化 Contents Polar Web【中等】反序列化思路&探索EXPPHP生成PayloadGET传递参数 运行&总结 思路&探索 一个经典的反序列化问题&#xff0c;本文采用PHP代码辅助生成序列字符串的方式生成 Payload 来进行手动渗透。 打开站点&#xff0c;分析…

2024 vite 静态 scp2 自动化部署

1、导入库 npm install scp2 // 自动化部署 npm install chalk // 控制台输出的语句 npm install ora2、核心代码 创建文件夹放在主目录下的 deploy/index.js 复制粘贴以下代码&#xff1a; import client from scp2; import chalk from chalk; import ora from ora;const s…

聊一聊大数据需求的流程

大致的流程&#xff1a;需求对接、口径梳理、数据开发、任务发布、任务监控、任务保障 流程图 startuml skinparam packageStyle rectangleactor 需求方 participant 数据BP as 数据组 participant 离线数仓 participant 实时数仓需求方 -> 数据组: 提出需求 数据组 -> …

数据挖掘--认识数据

数据挖掘--引论 数据挖掘--认识数据 数据挖掘--数据预处理 数据挖掘--数据仓库与联机分析处理 数据挖掘--挖掘频繁模式、关联和相关性&#xff1a;基本概念和方法 数据挖掘--分类 数据挖掘--聚类分析&#xff1a;基本概念和方法 数据对象与属性类型 属性&#xff1a;是一…

STM32关于uc/OS-III的多任务程序

目录 一、UCOS-III源码获取 二、HAL库工程的建立 1.RCC配置 2.SYS配置 3.USART1配置 4.GPIO配置 5.时钟配置 6.项目配置 三、KEil文件添加 1.文件复制 2.KEil工程添加 3.添加文件路径 四、代码修改 1. 2.修改文件app_cfg.h中代码 3.修改include.h的代码 4.修改…

数据库 | 关系数据库设计

第七章 1.简述数据库的设计阶段&#xff1f;&#xff08;简要回答数据库设计步骤&#xff1f;&#xff09;&#xff08;&#xff08;数据库设计有哪几个阶段&#xff1f;&#xff09; 需求分析、概念结构设计、逻辑结构设计、物理结构设计、数据库的实施、数据库的运行和维护…