2025年第十六届蓝桥杯省赛C++ 研究生组真题
- 1.说明
- 2.题目A:数位倍数(5分)
- 3.题目B:IPv6(5分)
- 4.题目C:变换数组(10分)
- 5.题目D:最大数字(10分)
- 6.题目E:冷热数字队列(15分)
- 7.题目F:01串(15分)
- 8.题目G:甘蔗(20分)
- 9.题目H:原料采购(20分)
1.说明
真题来源于十六届蓝桥杯赛后直播间,受大风天气影响的地区(北京、天津和河北)题目应该会变动,我这里参加的实际是河北C++研究生组。考虑到时间关系,将重点放在写研究生组真题上,但是由于算法实力有限,短时间内还不能够将所有题解整体出来,因此部分题目只放题目,等之后解出来了再补上题解。如果还对A组题目感兴趣的,可以看看2025年第十六届蓝桥杯省赛C++ A组真题,A组题目和研究生组省赛难度差不多。
2.题目A:数位倍数(5分)
【问题描述】
请问在 1 至 202504(含)中,有多少个数的各个数位之和是 5 的整数倍。例如:5、19、8025 都是这样的数。
#include <iostream>
int main() {
int count = 0;
for (int i = 1; i <= 202504; ++i) {
int sum = 0;
int temp = i;
while (temp > 0) {
sum += temp % 10;
temp /= 10;
}
if (sum % 5 == 0) {
count++;
}
}
std::cout << count << std::endl;
return 0;
}
3.题目B:IPv6(5分)
【问题描述】
小蓝最近在学习网络工程相关的知识。他最近学习到,IPv6 地址本质上是一个 128 位的二进制数,而字符串形式的 IPv6 地址是由被冒号分开的八段 16 进制数组成的,例如,下面每行是一个字符串形式的 IPv6 地址:
0000:0000:0000:0000:0000:0000:0000:0000
0000:0001:0000:0000:0000:0001:0000:0000
0000:0001:00ab:0000:0023:0000:0a00:0e00
0000:0000:00ab:0000:000a:0001:0a00:0e00
0000:0000:00ab:0000:0000:0001:0a00:0e00
其中,每一段最长 4 位,且每一段的前导零都可以去掉(如果 4 位都为 0 需要写成 0)。
另外,IPv6 地址还可以将其中相邻的值为 0 的段合并压缩起来,用两个冒号来表示,不过只能压缩一段。
例如上述地址最短的压缩后的形式分别为
::
0:1::1:0:0
0:1:ab:23:0:a00:e00
::ab:0:a:1:a00:e00
0:0:ab::1:a00:e00
小蓝想知道,所有 IPv6 地址的最短压缩形式的长度的和为多少?由于答案很大(甚至超过了 128 位二进制整数的范围),请填写答案时填写这个总和除以10^9+7的余数。
这里有一种暴力思路,可以提前计算出每个0-255对应的长度,存入到hash中,然后依使用6重循环拿到结果。
4.题目C:变换数组(10分)
【问题描述】
输入一个数组 a ,包含有 n 个元素 a1,a2,…,an。对这个数组进行 m 次变换,每次变换会将数组 a 中的每个元素 ai 转换为 ai · bitCount(ai)。其中 bitCount(x) 表示数字 x 的二进制表示中 1 出现的次数,例如 bitCount(3)=2,因为 3 的二进制表示为 11,其中 1 出现了两次。
请输出变换之后的数组内容。
【输入格式】
输入的第一行包含一个正整数 n ,表示数组 a 中的元素个数。
第二行包含 n 个整数 a1,a2,…,an,相邻整数之间使用一个空格分隔。
第三行包含一个整数 m,表示变换次数。
【输出格式】
输出一行,包含 n 个整数,相邻整数之间使用一个空格分隔,表示变换之后得到的数组 a。
【样例输入】
2
5 7
2
【样例说明】
5=(101)2,7=(111) 2,第一次变化后 a=[10,21]。
10=(1010) 2,21=(10101) 2,第二次变换后 a=[20,63]。
【样例输出】
20 63
5.题目D:最大数字(10分)
【问题描述】
我们有 n 个连续的整数 1,2,3,…,n,可以自由排列它们的顺序。
然后,我们把这些数字转换成二进制表示,按照排列顺序拼接形成一个新的二进制数。
我们的目标是让这个二进制数的值最大,并输出这个二进制对应的十进制表示。
【输入格式】
输入一行包含一个正整数 n 。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
3
【样例输出】
30
【样例说明】
1 的二进制为 1;2 的二进制为 10;3 的二进制为 11;其组成的最大的二进制数字为 11110,对应的十进制数字为 30。
6.题目E:冷热数字队列(15分)
小蓝是一名计算机专业的学生,最近他学习了《操作系统》、《数据结构》等课程,他设计了一种名为“冷热数据队列”的数据结构,来对数据页进行管理。
冷热数据队列 q 可以看做由两个子队列组成:长度为 n1 的热数据队列 q1 和长度为 n2 的冷数据队列 q2 。当我们需要访问某个数据页 p 时:
(1)若 p 不在队列 q 中(即既不在 q1 中,也不在 q2 中),则加载数据页 p ,并插入到 q2 的首部。
(2)若 p 已经在队列 q 中,则将 p 移动至 q1 首部。
(3)当 q1 或 q2 队列容量不足时,会将其尾部的数据页淘汰出去。
(4)当 q1 已满,但 q2 未满时,从 q1 中淘汰出的数据页会移动到 q2 首部。
【输入格式】
输入的第一行包含两个正整数 n1,n2,用一个空格分隔。
第二行包含一个整数 m ,表示操作次数。
第三行包含 m 个正整数 v1, v2, …, vm,表示依次访问到的数据页的编号,相邻整数之间使用一个空格分隔。
【输出格式】
输出两行。
第一行包含若干个整数,相邻整数之间使用一个空格分隔,依次表示 q1中的数据页。
第二行包含若干个整数,相邻整数之间使用一个空格分隔,依次表示 q2 中的数据页。
【样例输入】
3 3
10
1 2 3 4 3 2 2 1 3 4
【样例输出】
4 3 2
1
【样例说明】
7.题目F:01串(15分)
【问题描述】
给定一个由 0,1,2,3…的二进制表示拼接而成的长度无限的 01 串。其前若干位形如 011011100101110111… 。请求出这个串的前 x 位里有多少个 1 。
【输入格式】
输入的第一行包含一个正整数 x 。
【输出格式】
输出一行包含一个整数表示答案。
【样例输入】
7
【样例输出】
5
8.题目G:甘蔗(20分)
【问题描述】
小蓝种了一排甘蔗,甘蔗共 n 根,第 i 根甘蔗的高度为 ai 。小蓝想砍一些甘蔗下来品尝,但是他有强迫症,不希望甘蔗的高度显得乱糟糟的。具体来说,他给出了一个大小为 m 的整数集合 B = {b1,b2,…,bm} ,他希望在砍完甘蔗后,任意两根相邻的甘蔗之间的高度差 |ai - ai+1| 都要在这个集合 B 中。小蓝想知道他最少需要砍多少根甘蔗(对于高度为 h 的甘蔗,他可以将其砍成 x 高度的甘蔗,x ∈{0,1,2,…,h - 1})。
【输入格式】
输入的第一行包含两个正整数 n,m,用一个空格分隔。
第二行包含 n 个正整数 a1,a2,…,an ,相邻整数之间使用一个空格分隔。
第三行包含 m 个正整数 b1,b2,…,bm ,相邻整数之间使用一个空格分隔。
【输出格式】
输出一行包含一个整数表示答案。如果不能满足条件,输出 -1 。
【样例输入】
6 3
6 7 3 4 9 12
2 3 5
【样例输出】
2
【样例说明】
其中一种方案:将 a2 砍为 3,再将 a3 砍为 1。
9.题目H:原料采购(20分)
【问题描述】
小蓝负责一家工厂的原料采购。工厂有一辆运货卡车,其容量为 m 。工厂附近的采购点都在同一条路的同一方向上,一共有 n 个,每个采购点和工厂的距离各不相同。其中,第 i 个采购点的价格为 ai ,库存为 bi,距离为 ci。卡车每行驶一单位长度的路径就需要额外花费 o 。(返程没有花费,你也可以认为 o 实际是行驶两单位长度的花费)。请计算将卡车装满最少需要花费多少钱,如果没有任何方案可以装满请输出 -1 。
【输入格式】【输出格式】【样例输入】【样例输出】,因直播没有给出,欢迎大家在评论区补充(或者后续官方放出来我再补充一下)。这里应该是考察背包问题。
到这里就结束啦,整理不易,欢迎关注【Jerry说前后端】、点赞并分享,获取更多前端和算法知识。