第 13 届蓝桥杯 C++ 青少组省赛中 / 高级组真题解析

一、选择题
第 1 题

题目:下列关于类中声明的变量描述正确的是 ( )。
选项
A. 只属于该类
B. 属于全局变量
C. 任何情况下都可被该类所有实例共享
D. 属于该类,某些情况下也可被该类不同实例所共享

答案:D
解析

  • 类中声明的变量是成员变量,属于类而非全局变量(排除 B)。
  • 成员变量分为实例变量和静态变量:
    • 实例变量属于类的每个对象(实例),不同实例的实例变量相互独立(不共享)。
    • 静态变量(用static声明)属于类本身,被所有实例共享。
  • 选项 D 正确,因为静态变量在 “某些情况下”(即作为静态成员时)可被共享,而实例变量不共享。

考点:C++ 类的成员变量(实例变量与静态变量的区别)。
教学重点:理解static关键字对成员变量的作用,区分类成员与全局变量。

第 2 题

题目:下列对抽象类描述正确的是 ( )。
选项
A. 抽象类没有构造方法
B. 抽象类必须提供抽象方法
C. 抽象类可以通过 new 关键字直接实例化
D. 有抽象方法的类一定是抽象类

答案:D
解析

  • 抽象类可以有构造方法(用于派生类初始化,排除 A)。
  • 抽象类可以包含抽象方法,也可以没有抽象方法(但包含抽象方法的类必须是抽象类),故 B 错误。
  • 抽象类不能直接实例化(排除 C)。
  • D 正确:只要类中存在至少一个抽象方法(纯虚函数),该类必须声明为抽象类。

考点:C++ 抽象类与纯虚函数的定义。
教学重点:抽象类的特性(不能实例化、包含纯虚函数),构造方法的存在性。

第 3 题

题目:二进制减法11101101 - 11001001的结果是 ( )。
选项
A. 10111011
B. 11001001
C. 100100
D. 10101111

答案:C
解析

  • 二进制减法规则:相同位相减,不够借位(借 1 当 2)。
  • 计算过程:

    plaintext

      11101101  
    - 11001001  
    -----------  
      00100100 (二进制)= 36(十进制)  
    
  • 结果为100100(选项 C)。

考点:二进制运算(减法、借位规则)。
教学重点:二进制与十进制的转换,减法运算步骤。

第 4 题

题目:以下数据结构中,能够按照 “先进后出” 原则存取数据的是 ( )。
选项
A. 栈
B. 队列
C. 二叉树
D. 循环队列

答案:A
解析

  • 栈(Stack)遵循 “先进后出”(LIFO)原则。
  • 队列(Queue)和循环队列遵循 “先进先出”(FIFO),二叉树无固定存取顺序。

考点:数据结构的基本特性(栈与队列的区别)。
教学重点:栈和队列的典型操作(push/pop vs enqueue/dequeue)。

第 5 题

题目:下列对int *p[3]描述正确的是 ( )。
选项
A. p[3]表示数组的第 3 个元素的值,是 int 类型的值
B. p是一个具有 3 个元素的指针数组,每个元素是一个 int 类型指针
C. p是一个指向数组的指针,所指向的数组是 3 个 int 类型元素
D. p是一个指向某数组中第 3 个元素的指针,该元素是 int 型变量

答案:B
解析

  • 运算符优先级:[]高于*,故int *p[3]表示 “一个数组,元素是 int 指针”,即指针数组。
  • 选项 B 正确;C 描述的是int (*p)[3](数组指针),需注意括号优先级。

考点:指针数组与数组指针的区别(运算符优先级)。
教学重点:通过括号区分指针数组(*p[])和数组指针((*p)[])。

二、编程题
第 6 题:统计数字

题目描述:给定正整数 N,统计 3 到 N 之间个位数为 3 的数的个数。
样例输入:25 → 输出:3(3, 13, 23)。

解题思路

  • 个位数为 3 的数构成等差数列:3, 13, 23, ..., 最大不超过 N。
  • 首项a1=3,公差d=10,末项an ≤ N
  • 项数公式:count = ((N - 3) // 10) + 1(当 N ≥ 3 时)。

代码思路

  1. 输入 N。
  2. 计算从 3 开始,每次加 10,直到超过 N,统计个数。

考点:数学规律(等差数列项数计算)、边界条件处理。
教学重点:如何通过模运算或数学公式快速统计符合条件的数,避免遍历。

第 7 题:字母组合

题目描述:输入 N 个小写字母,排序后拼接成字符串。
样例输入:4 c d a c → 输出:accd。

解题思路

  • 将字母存入数组,使用 C++ 的sort函数排序(字符默认按 ASCII 码排序,小写字母顺序正确)。
  • 排序后逐个拼接字符为字符串。

代码思路

  1. 读取 N 和字母数组。
  2. 对数组排序(sort(arr, arr + N))。
  3. 遍历数组,拼接成字符串输出。

考点:排序算法(内置排序函数的使用)、字符串操作。
教学重点sort函数的使用,字符数组与字符串的转换。

第 8 题:组合

题目描述:给定 N 种汤圆规格,求不能买到的数量的个数,若无限则输出 - 1。
样例输入:2 3 5 → 输出:4(1,2,4,7)。

解题思路

  1. 判断是否无限解:若 N 种规格的最大公约数(GCD)>1,则存在无限个无法表示的数(如 2 和 4 的 GCD=2,无法表示 1,3,5 等奇数)。
  2. 有限解情况(GCD=1):使用动态规划标记可表示的数。设dp[i]表示数 i 是否可被表示,初始dp[0]=true,然后对每个规格 a,遍历i=a到最大可能值(如 10000),标记dp[i] = dp[i-a]
  3. 统计所有i≥1dp[i]=false的数的个数。

代码步骤

  1. 计算 N 个数的 GCD,若 > 1 则输出 - 1。
  2. 否则,初始化dp数组,遍历规格更新dp
  3. 统计不可表示的数的个数。

考点:数论(GCD 判断无限解)、动态规划(硬币问题)。
教学重点:硬币问题的有限解与无限解条件,动态规划状态转移方程。

第 9 题:帮助

题目描述:志愿者认领贫困生,每个志愿者金额≥学生金额时可认领,求最多认领人数。
样例输入:学生金额 [200,145,240,50,45],志愿者 [150,300] → 输出 4。

解题思路

  • 贪心策略:将学生和志愿者金额分别排序,用双指针匹配。
  • 学生按金额从小到大排序,志愿者按金额从小到大排序。
  • 对每个志愿者,尽可能匹配金额最小的未被认领且≤其金额的学生。

代码步骤

  1. 排序学生金额(升序)和志愿者金额(升序)。
  2. 初始化双指针i=0(学生),j=0(志愿者),计数count=0
  3. 遍历志愿者,若当前志愿者金额≥当前学生金额,则认领(count++i++),否则跳过该志愿者(志愿者金额小,无法认领任何学生)。

考点:贪心算法、排序与双指针技巧。
教学重点:为何贪心策略有效(小志愿者匹配小学生,保留大志愿者匹配大学生)。

第 10 题:路线

题目描述:求景点 1 到 N-1 每个景点到 N(游客服务中心)的最短路线数,不可达输出 - 1。
样例输入:N=5,路线 1-2,1-3,2-4,2-5 → 输出:2 1 3 2(景点 1 到 5 需 2 步,景点 2 到 5 需 1 步,等)。

解题思路

  • 无向图最短路径问题,边权均为 1,适合 BFS(广度优先搜索)。
  • 以 N 为起点,反向计算各节点到 N 的最短距离(因为题目求的是各节点到 N 的距离,BFS 从 N 出发更方便)。
  • 初始化距离数组为 - 1(不可达),N 的距离为 0,队列加入 N,然后逐层扩展相邻节点,更新距离。

代码步骤

  1. 构建邻接表存储图。
  2. 初始化距离数组,BFS 队列从 N 出发。
  3. 对每个节点,遍历邻接点,若未访问过则更新距离并加入队列。
  4. 按顺序输出 1 到 N-1 节点的距离。

考点:图论基础、BFS 算法(最短路径在无权图中的应用)。
教学重点:BFS 的实现(队列使用、访问标记),反向搜索的思路。

第 11 题:奖品

题目描述:寻找正方形区域,其中一条对角线全为 1,其他全为 0,求最大奖品数(对角线长度)。
样例输入:输出 4(边长为 4 的正方形,主对角线有 4 个 1,其他为 0)。

解题思路

  1. 枚举所有可能的正方形:左上角坐标(i,j),边长k,正方形范围为(i,j)(i+k-1, j+k-1)
  2. 检查两种对角线
    • 主对角线(左上到右下):每个位置(i+t, j+t)是否为 1(t=0 到 k-1)。
    • 副对角线(右上到左下):每个位置(i+t, j+k-1-t)是否为 1(t=0 到 k-1)。
  3. 其他位置检查:正方形内非对角线位置是否全为 0。
  4. 记录符合条件的最大边长k(奖品数为 k,因为对角线有 k 个 1)。

代码步骤

  1. 遍历所有可能的左上角(i,j)和边长k(最大边长为 min (N,M))。
  2. 对每个正方形,检查对角线是否全 1,其他位置全 0。
  3. 维护最大奖品数max_count

考点:二维数组枚举、条件判断(对角线与非对角线元素检查)。
教学重点:如何高效枚举正方形(避免重复),双重对角线检查的逻辑。

三、教学方案总结

选择题部分
  1. C++ 类与对象:重点讲解成员变量(实例 vs 静态)、抽象类特性(纯虚函数、不能实例化)。
  2. 数据结构基础:对比栈与队列的存取原则,指针数组与数组指针的语法区别。
  3. 二进制运算:通过实例演示减法借位规则,强化进制转换练习。
编程题部分
  1. 数学问题(统计数字、组合):培养找规律能力,掌握 GCD 判断无限解、等差数列项数计算。
  2. 排序与贪心(字母组合、帮助):熟练使用内置排序函数,理解贪心策略的正确性证明。
  3. 图论与 BFS(路线):通过画图演示 BFS 过程,掌握邻接表构建和队列操作。
  4. 二维枚举与条件判断(奖品):学会分层枚举(行、列、边长),编写清晰的条件判断逻辑。
学习建议
  • 针对选择题,整理 C++ 基础概念易错点(如抽象类构造方法、指针数组定义)。
  • 编程题注重算法思维训练,从简单样例入手,逐步推导通用解法,多进行边界条件测试(如 N=3、空输入等)。
  • 结合蓝桥杯真题反复练习,重点掌握 BFS、动态规划、贪心等基础算法的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值