2025年第十六届蓝桥杯省赛C++ 研究生组真题

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说前后端】、点赞并分享,获取更多前端和算法知识。

### 蓝桥杯研究生 C++ 题目及解析 蓝桥杯作为一项面向全国高校学生的编程事,其研究生的题目通常具有较高的难度和综合性。以下是关于蓝桥杯研究生 C++ 的一些典型题目及其解析。 #### 一、题目背景与特点 蓝桥杯研究生的比注重考察参者的逻辑思维能力以及对复杂算法的理解和应用能力。题目可能涉及但不限于以下几个方面: - 字符串处理 - 数学计算 - 数据结构的应用(如树、图) - 动态规划 - 模拟与枚举 这些题目往往需要选手具备扎实的基础知识,并能够灵活运用所学解决实际问题[^1]。 #### 二、具体实例分析 ##### 实例 1:字符串转换为数值 给定一段代码用于将字母成的字符串转化为对应的十进制数: ```cpp #include <iostream> #include <cstdio> #include <cstring> using namespace std; int main(){ char str[100]; gets(str); int str_len = strlen(str); long long ans = 0; for(int i=0;i<str_len;i++){ ans = ans*26 + (str[i]-'A'+1); } cout << ans << endl; return 0; } ``` 此段代码的功能是把由大写字母构成的字符串映射成一个整数序列,其中每个字符按照'A'=1,'B'=2,...,'Z'=26的方式编码并累加得到最终结果[^2]。 ##### 实例 2:布尔运算合计数 考虑如下问题:“在一个多级嵌套的布尔表达式中,如果已知输入变量集合 {1,0,1,0,1} ,那么通过合理安排‘与’(&&)、‘或’(||) 和 ‘异或’(^) 这些操作符的位置,可以使整个表达式的输出等于 true(即1) 。请问这样的合法配置共有多少种?” 这类问题是典型的回溯法应用场景之一。可以通过递归尝试每一种可能性来统计满足条件的情况数目。由于状态空间较大,在实现过程中还需要注意剪枝优化以提高效率[^3]。 #### 三、学习建议与资源推荐 为了更好地准备蓝桥杯特别是针对研究生级别的挑战,可以从以下几个方向着手复习备考: 1. **掌握基础语法**:熟练使用C++标准模板库(STL),熟悉各种容器类(vector,set,map等)的操作方法。 2. **深入理解经典算法**:包括但不限于贪心策略、分治思想、动态规划原理等等。 3. **练习历真题**:通过做历的考试原题加深印象,总结常见套路模式。 4. **参与交流讨论**:加入官方提供的QQ群聊或其他社区平台与其他爱好者共同探讨技术难题。 最后提醒大家保持良好的心态面对每一次训练机会,不断积累经验才能取得理想成绩!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry说前后端

请作者喝杯冰阔落~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值