2025年第十六届蓝桥杯省赛C++ A组真题
- 1.说明
- 2.题目A:寻找质数(5分)
- 3.题目B:黑白棋(5分)
- 4. 题目C:抽奖(10分)
- 5. 题目D:红黑树(10分)
- 6. 题目E:黑客(15分)
- 7. 题目F:好串的数目(15分)
- 8. 题目G:地雷阵(20分)
- 9. 题目H:扫地机器人(20分)
1.说明
真题来源于十六届蓝桥杯赛后直播间,受大风天气影响的地区(北京、天津和河北)题目应该会变动,我这里参加的实际是河北C++研究生组。考虑到时间关系,将重点放在写研究生组真题上,所以C++ A组题目主要放题目资料,这里的题目要是想短时间给写出来还是太有挑战了,之后如果研究生组的题目看的差不多了再回来补一下A组题目,好像A组题目和研究生组题目难度差不多。
2.题目A:寻找质数(5分)
如果一个正整数只能被 1 和它本身两个数整除,就称为一个质数。最小的几个质数依次是 2,3,5,7,11,13,···,请问,第 2025 个质数是多少?
#include <iostream>
#include <cmath>
// 判断一个数是否为质数
bool isPrime(int num) {
if (num < 2) return false;
for (int i = 2; i <= std::sqrt(num); ++i) {
if (num % i == 0) return false;
}
return true;
}
int main() {
int count = 0;
int num = 2;
while (true) {
if (isPrime(num)) {
++count;
if (count == 2025) {
std::cout << "第 2025 个质数是: " << num << std::endl;
break;
}
}
++num;
}
return 0;
}
3.题目B:黑白棋(5分)
小蓝最近迷上了一款名为“黑白棋填充”的游戏。该游戏在一个方形网格棋盘上进行,其中部分格子已经填有黑色或白色的棋子,而其他格子为空,等待玩家填入棋子。游戏规则是,玩家需要按照以下规则填满整个棋盘,才能算作胜利:
(1) 黑白棋子数量均等:在每一行和每一列中,黑色棋子和白色棋子的数量必须相等。
(2)相邻棋子限制:在棋盘的任何一行或一列中,不能有超过两个相同颜色的棋子连续排列(即不允许出现“黑黑黑”或“白白白”的情况)。
(3)行列唯一性:每一行的棋子排列方式必须是唯一的,不能与棋盘中的任何其他行完全相同。每一列的棋子排列方式必须是唯一的,不能与棋盘中的任何其他列完全相同。行与列之间的棋子排列不作比较,即行可以与列相同,无需满足行列间的唯一性。
提示:二进制表示法搜索剪枝。100000000000000000001000001100001111。
4. 题目C:抽奖(10分)
LQ 商场为了回馈广大用户,为在此消费的用户提供了抽奖机会:抽奖机有三个转轮,每个转轮上都分布有 n 个数字图案,标号为 1 ~ n ,按照从 1 到 n 顺序转动,当转到第 n 个图案时会从第一个继续开始。奖项如下:
(1)三个相同的图案,积分 +200 ;
(2)两个相同的图案,积分 +100 ;
(3)三个数字图案,从左到右连续(例如 1,2,3 ),积分 +200 ;
(4)三个数字图案,经过顺序调整后连续(例如 2,1,3 或 3,2,1 ),积分 +100 ;
抽奖机处于初始状态,三个转轮都处于第一个位置。每次开始抽奖,都会产生三个对应的随机数 xi1,xi2 ,xi3 ,表示第 j 个转轮会向后转动 xij 次停下。下次抽奖时,转轮会从上一次转动后的位置开始继续转动。
注意,一次抽奖最多只能获得一次积分,如果同时命中多个奖项,以积分最大的那个奖项为准。请问,如果执行 m 次抽奖,总积分值是多少?
【输入格式】
输入的第一行包含一个正整数 n,表示转轮大小。
第二行包含 n 个正整数
a
1
,
a
2
,
⋯
,
a
n
a_1,a_2,\cdots,a_n
a1,a2,⋯,an,依次表示第一个转轮上的数字图案,相邻整数之间使用一个空格分隔。
第三行包含 n 个正整数
b
1
,
b
2
,
⋯
,
b
n
b_1,b_2,\cdots,b_n
b1,b2,⋯,bn,依次表示第二个转轮上的数字图案,相邻整数之间使用一个空格分隔。
第四行包含 n 个正整数
c
1
,
c
2
,
⋯
,
c
n
c_1,c_2,\cdots,c_n
c1,c2,⋯,cn,依次表示第三个转轮上的数字图案,相邻整数之间使用一个空格分隔。
第五行包含一个整数 m,表示抽奖次数。
接下来 ( m ) 行,每行包含三个正整数 (xi1,xi2,xi3),相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案,即 ( m ) 次抽奖累计获得的积分的值。
【样例输入】
4
3 2 4 1
2 2 2 2
4 3 0 9
3
4 4 4
3 1 1
40 39 2
【样例输出】
300
【样例说明】
三个转轮在初始状态下都在位置 1。
第一次抽奖,三个转轮都转动 4 次,都转一整圈到达位置 1,三个转轮上的数字图案分别是 3、2、4,积分 +100;
第二次抽奖,第一个转轮转动 3 次到达位置 4,第二个转轮转动 1 次到达位置 2,第三个转轮转动 1 次到达位置 2,三个转轮上的数字图案分别是 1、2、3,积分 +200;
第三次抽奖,第一个转轮转动 40 次到达位置 4,第二个转轮转动 39 次到达位置 1,第三个转轮转动 2 次到达位置 4,三个转轮上的数字图案分别是 1、2、9,积分不增加。
因此总积分为 300。
5. 题目D:红黑树(10分)
【问题描述】
小蓝最近学习了红黑树,红黑树是一种特殊的二叉树,树上的结点有两种类型:红色结点和黑色结点。
小蓝在脑海中构造出一棵红黑树,构造方式如下:
(1)根结点是一个红色结点;
(2)如果当前结点 curNode 是红色结点,那么左子结点 curNode.left 是红色结点,右子结点 curNode.right 是黑色结点;
(3)如果当前结点 curNode 是黑色结点,那么左子结点 curNode.left 是黑色结点,右子结点 curNode.right 是红色结点;
此二叉树前几层的形态如下图所示:
【输入格式】
输入的第一行包含一个正整数 ( m ),表示小蓝挑选的结点数。
接下来 ( m ) 行,每行包含两个正整数 (ni,ki),用一个空格分隔,表示小蓝挑选的结点是第 ni 行(从上往下数)第 ki 个(从左往右数)结点。
【输出格式】
输出 ( m ) 行,每行包含一个字符串,依次表示小蓝每次挑选的结点的答案。RED 表示红色结点,BLACK 表示黑色结点。
【样例输入】
2
1 1
2 2
【样例输出】
RED
BLACK
6. 题目E:黑客(15分)
【问题描述】
小蓝正在两台电脑之间拷贝数据,数据是一个 (n×m) 大小的正整数矩阵,因此总共有 (n×m + 2) 个由空格分开的整数,其中前两个整数分别为 (n) 和 (m)。然而,有黑客入侵了小蓝的电脑,导致这 (n×m + 2) 个正整数的顺序被打乱了,小蓝想知道最多可能有多少个不同的原矩阵。
两个矩阵相同当且仅当它们行数相同、列数分别相同,且每个位置上的数相同。
【输入格式】
输入的第一行包含一个正整数 (n×m + 2)。
第二行包含 (n×m + 2) 个正整数 (a1,a2,…,an×m + 2),相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。答案可能很大,请输出答案除以 1000000007 的余数。
【样例输入】
2 2 1 4 3 3
【样例输出】
24
7. 题目F:好串的数目(15分)
【问题描述】
对于一个长度为 (n) 的字符串 (s = s0s1…sn-1) 来说,子串的定义是从中选出两个下标 l,r(0 ≤ l ≤ r ≤n-1),这之间所有的字符组合起来的一个新的字符串:(s’ = sl…sr) 就是其中一个子串。
现在给出一个只有数字字符 0~9 组成的数字字符串,小蓝想要知道在其所有的子串中,有多少个子串是好串。一个子串是好串,当且仅当它满足以下两个条件之一:
(1)单字符子串一定是好串,即当子串长度为 1 时,它总是好串;
(2)长度大于 1 时,可以拆分为两个连续非递减子串。
其中,一个串 (p = p0p1…pn-1) 为连续非递减子串是指,对于所有 (1≤ i < k),满足 (pi = pi-1) 或 (pi = pi-1+1)。即数字串中的每一个数字,要么等于上一个数字,要么等于上一个数字加 1。例如 12233、456 是连续非递减子串。
【输入格式】
输入一行包含一个字符串 (s)。
【输出格式】
输出一行包含一个整数表示答案,即好串的数目。
【样例输入】
12258
【样例输出】
12
【样例说明】
长度为1的好串:1、2、2、5、8。它们长度都为1,都是好串。
长度为2的好串:12、22、25、58。12可以分割为1、2两个连续非递减子串,其它类似。
长度为3的好串:122、225。122可以分割为12、2两个连续非递减子串;225可以分割为22、5两个连续非递减子串。
长度为4的好串:1225。1225可以分割为122、5两个连续非递减子串。
总计12个好串。
8. 题目G:地雷阵(20分)
【问题描述】
小蓝正在平面直角坐标系中的第一象限里玩一个逃生小游戏,在第一象限中埋有 (n) 颗地雷,第 i 颗地雷的坐标为 (xi, yi),触发范围为以 (xi, yi) 为圆心,半径为 ri 的圆。一旦小蓝走进了圆内就会触发地雷导致游戏失败。小蓝初始在原点 (0,0) 上,他需要在第一象限内选择一个方向一直往前走,如果能不触发任何地雷即可成功通关游戏。他想知道在 [0,π/2] 中均匀随机选择一个方向,即在 (0°)(朝向 x 轴正方向)至 90°(朝向 y 轴正方向)之间随机选择一个方向,通关游戏的概率是多少?
【输入格式】
输入的第一行包含一个正整数 (n)。
接下来 (n) 行,每行包含三个正整数 (xi, yi),相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个实数,四舍五入保留三位小数,表示答案。
【样例输入】
2
1 3 1
3 1 1
【样例输出】
0.181
9. 题目H:扫地机器人(20分)
【问题描述】
在一个含有 n 个点 n 条边的无重边无自环的连通无向图中,有一个扫地机器人在执行清扫作业,其中结点 i 的标记 ti ∈{0, 1},如果为 1,则说明该结点需要进行清扫,扫地机器人在到达这个结点时会顺便进行清扫工作。机器人想知道,如果选定任意结点出发,每条边只能经过一次的话,最多能清扫多少个待清扫结点?
【输入格式】
输入的第一行包含一个正整数 n。
第二行包含 n 个整数 t1, t2, … , tn,相邻整数之间使用一个空格分隔。
接下来 n 行,每行包含两个正整数 ui, vi,用一个空格分隔,表示结点 ui 和结点 vi 之间有一条边。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
9
1 0 1 0 0 1 1 0 1
2 8
2 9
2 5
1 5
1 3
1 4
4 5
4 6
6 7
【样例输出】
4
【样例说明】
其中一种路线:3 → 1 → 4 → 6 → 7。
到这里就结束啦,整理不易,欢迎关注【Jerry说前后端】、点赞并分享,获取更多前端和算法知识。