【资料】第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组原题

本文介绍了第十四届蓝桥杯大赛软件赛决赛C/C++大学B组的考试规则和部分编程题目。试题涵盖结果填空和程序设计,要求选手编写符合标准的C/C++代码,解决数学逻辑和算法问题。比赛规定了提交答案的方式和格式,以及程序的通用性要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

打字不易,点个赞叭

第十四届蓝桥杯大赛软件赛决赛 C/C++ 大学 B 组

第十四届蓝桥杯大赛软件赛决赛
C/C++ 大学 B 组

【考生须知】

考试开始后,选手首先下载题目,并使用考场现场公布的解压密码解压试题.
考试时间为 4 小时。考试期间选手可浏览自己已经提交的答案,被浏览的答案允许拷贝。时间截止后,将无法继续提交或浏览答案.对同一题目,选手可多次提交答案,以最后一次提交的答案为准。选手必须通过浏览器方式提交自己的答案。选手在其它位置的作答或其它方式提交的答案无效。试题包含“结果填空”和“程序设计”两种题型。
结果填空题:要求选手根据题目描述直接填写结果。求解方式不限。不要求源代码。把结果填空的答案直接通过网页提交即可,不要书写多余的内容。程序设计题:要求选手设计的程序对于给定的输入能给出正确的输出结果。考生的程序只有能运行出正确结果才有机会得分。
注意:在评卷时使用的输入数据与试卷中给出的示例数据可能是不同的。选手的程序必须是通用的,不能只对试卷中给定的数据有效。对于编程题目,要求选手给出的解答完全符合 GNU C/C++ 标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的 API,代码中允许使用 STL 类库。
注意: main 函数结束必须返回 0。
注意: 所有依赖的函数必须明确地在源文件中 #include ,不能通过工程设置而省略常用头文件。所有源码必须在同一文件中。调试通过后,拷贝提交。提交时,注意选择所期望的编译器类型。

试题 A: 子 2023

本题总分:5 分

【问题描述】

小蓝在黑板上连续写下从 1 到 2023 之间所有的整数,得到了一个数字序列:
S = 12345678910111213 . . . 20222023。
小蓝想知道 S 中有多少种子序列恰好等于 2023?
提示,以下是 3 种满足条件的子序列(用中括号标识出的数字是子序列包含的数字):
1[2]34567891[0]111[2]1[3]14151617181920212223…
1[2]34567891[0]111[2]131415161718192021222[3]…
1[2]34567891[0]111213141516171819[2]021222[3]…
注意以下是不满足条件的子序列,虽然包含了 2、0、2、3 四个数字,但是顺序不对:
1[2]345678910111[2]131415161718192[0]21222[3]…

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题 B: 双子数

本题总分:5 分

【问题描述】

若一个正整数 x 可以被表示为 p×p × q×q,其中 p、q 为质数且 p , q,则 x 是一个 “双子数”。请计算区间 [2333, 23333333333333] 内有多少个 “双子数”?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

试题 C: 班级活动

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分

【问题描述】

小明的老师准备组织一次班级活动。班上一共有 n 名(n 为偶数)同学,老师想把所有的同学进行分组,每两名同学一组。为了公平,老师给每名同学随机分配了一个 n 以内的正整数作为 id,第 i 名同学的 id 为 ai。老师希望通过更改若干名同学的 id 使得对于任意一名同学 i,有且仅有另一名同学 j 的 id 与其相同(ai = aj)。请问老师最少需要更改多少名同学的 id?

【输入格式】

输入共 2 行。
第一行为一个正整数 n。
第二行为 n 个由空格隔开的整数 a1, a2, …, an。
【输出格式】
输出共 1 行,一个整数。

【样例输入】

4
1 2 2 3

【样例输出】

1

【样例说明】

仅需要把 a1 改为 3 或者把 a3 改为 1 即可。

【评测用例规模与约定】

对于 20% 的数据,保证 n ≤ 103。
对于 100% 的数据,保证 n ≤ 105。

试题 D: 合并数列

时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分

【问题描述】

小明发现有很多方案可以把一个很大的正整数拆成若干正整数的和。他采取了其中两种方案,分别将他们列为两个数组 {a1, a2, …, an} 和 {b1, b2, …, bm}。两个数组的和相同。
定义一次合并操作可以将某数组内相邻的两个数合并为一个新数,新数的值是原来两个数的和。小明想通过若干次合并操作将两个数组变成一模一样,即 n = m 且对于任意下标 i 满足 ai = bi。请计算至少需要多少次合并操作可以完成小明的目标。

【输入格式】

输入共 3 行。
第一行为两个正整数 n, m。
第二行为 n 个由空格隔开的整数 a1, a2, …, an。
第三行为 m 个由空格隔开的整数 b1, b2, …, bm。
【输出格式】
输出共 1 行,一个整数。

【样例输入】

4 3
1 2 3 4
1 5 4

【样例输出】

1

【样例说明】

只需要将 a2 和 a3 合并,数组 a 变为 {1, 5, 4},即和 b 相同。

【评测用例规模与约定】

对于 20% 的数据,保证 n, m ≤ 103。
对于 100% 的数据,保证 n, m ≤ 105,0 < ai, bi ≤ 105。

试题 E: 数三角

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

【问题描述】

小明在二维坐标系中放置了 n 个点,他想在其中选出一个包含三个点的子集,这三个点能组成三角形。然而这样的方案太多了,他决定只选择那些可以组成等腰三角形的方案。请帮他计算出一共有多少种选法可以组成等腰三角形?

【输入格式】

输入共 n + 1 行。
第一行为一个正整数 n。
后面 n 行,每行两个整数 xi, yi 表示第 i 个点的坐标。

【输出格式】

输出共 1 行,一个整数。

【样例输入】

5
1 4
1 0
2 1
1 2
0 1

【样例输出】

4

【样例说明】

一共有 4 种选法:{2, 3, 4}、{3, 4, 5}、{4, 5, 2}、{5, 2, 3}。

【评测用例规模与约定】

对于 20% 的数据,保证 n ≤ 200。
对于 100% 的数据,保证 n ≤ 2000,0 ≤ xi, yi ≤ 109。

试题 F: 删边问题

时间限制: 1.0s 内存限制: 256.0MB 本题总分:15 分

【问题描述】

给定一个包含 N 个结点 M 条边的无向图 G,结点编号 1 . . . N。其中每个结点都有一个点权 Wi。你可以从 M 条边中任选恰好一条边删除,如果剩下的图恰好包含 2 个连通分量,就称这是一种合法的删除方案。对于一种合法的删除方案,我们假设 2 个连通分量包含的点的权值之和分别为 X 和 Y,请你找出一种使得 X 与 Y 的差值最小的方案。输出 X 与 Y 的差值。

【输入格式】

第一行包含两个整数 N 和 M。
第二行包含 N 个整数,W1, W2, . . . WN。
以下 M 行每行包含 2 个整数 U 和 V,代表结点 U 和 V 之间有一条边。

【输出格式】

一个整数代表最小的差值。如果不存在合法的删除方案,输出 −1。

【样例输入】

4 4
10 20 30 40
1 2
2 1
2 3
4 3

【样例输出】

20

【样例说明】

由于 1 和 2 之间实际有 2 条边,所以合法的删除方案有 2 种,分别是删除(2, 3) 之间的边和删除 (3, 4) 之间的边。
删除 (2, 3) 之间的边,剩下的图包含 2 个连通分量:{1, 2} 和 {3, 4},点权和分别是 30、70,差为 40。
删除 (3, 4) 之间的边,剩下的图包含 2 个连通分量:{1, 2, 3} 和 {4},点权和分别是 60、40,差为 20。

【评测用例规模与约定】

对于 20% 的数据,1 ≤ N, M ≤ 10000。
对于另外 20% 的数据,每个结点的度数不超过 2。
对于 100% 的数据,1 ≤ N, M ≤ 200000,0 ≤ Wi ≤ 109,1 ≤ U, V ≤ N。

试题 G: AB 路线

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【问题描述】

有一个由 N × M 个方格组成的迷宫,每个方格写有一个字母 A 或者 B。小蓝站在迷宫左上角的方格,目标是走到右下角的方格。他每一步可以移动到上下左右相邻的方格去。
由于特殊的原因,小蓝的路线必须先走 K 个 A 格子、再走 K 个 B 格子、再走 K 个 A 格子、再走 K 个 B 格子……如此反复交替。
请你计算小蓝最少需要走多少步,才能到达右下角方格?
注意路线经过的格子数不必一定是 K 的倍数,即最后一段 A 或 B 的格子可以不满 K 个。起点保证是 A 格子。
例如 K = 3 时,以下 3 种路线是合法的:
AA
AAAB
AAABBBAAABBB
以下 3 种路线不合法:
ABABAB
ABBBAAABBB
AAABBBBBBAAA

【输入格式】

第一行包含三个整数 N、M 和 K。
以下 N 行,每行包含 M 个字符(A 或 B),代表格子类型。

【输出格式】

一个整数,代表最少步数。如果无法到达右下角,输出 −1。

【样例输入】

4 4 2
AAAB
ABAB
BBAB
BAAA

【样例输出】

8

【样例说明】

每一步方向如下:下右下右上右下下;路线序列:AABBAABBA。

【评测用例规模与约定】

对于 20% 的数据,1 ≤ N, M ≤ 4。
对于另 20% 的数据,K = 1。
对于 100% 的数据,1 ≤ N, M ≤ 1000,1 ≤ K ≤ 10。

试题 H: 抓娃娃

时间限制: 1.0s 内存限制: 256.0MB 本题总分:20 分

【问题描述】

小明拿了 n 条线段练习抓娃娃。他将所有线段铺在数轴上,第 i 条线段的左端点在 li,右端点在 ri。小明用 m 个区间去框这些线段,第 i 个区间的范围是 [Li
, Ri]。如果一个线段有 至少一半 的长度被包含在某个区间内,则将其视为被这个区间框住。请计算出每个区间框住了多少个线段?

【输入格式】

输入共 n + m + 1 行。
第一行为两个正整数 n, m。
后面 n 行,每行两个整数 li,ri。
后面 m 行,每行两个整数 Li, Ri。

【输出格式】

输出共 m 行,每行一个整数。

【样例输入】

3 2
1 2
1 3
3 4
1 4
2 3

【样例输出】

3
2

【评测用例规模与约定】

对于 20% 的数据,保证 n, m ≤ 103。
对于 100% 的数据,保证 n, m ≤ 105,li < ri,0 < li,ri, Li, Ri ≤ 106,max{ri−li} ≤ min{Ri − Li}。

试题 I: 拼数字

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

【问题描述】

小蓝要用 N 个数字 2 和 M 个数字 3 拼出一个 N + M 位的整数。请你计算小蓝能拼出的最大的 2023 的倍数是多少?

【输入格式】

两个整数 N 和 M。

【输出格式】
一个 N + M 位的整数,代表答案。如果拼不出 2023 的倍数,输出 −1。

【样例输入】

2 8

【样例输出】

2233333333

【评测用例规模与约定】

对于 20% 的数据,1 ≤ N, M ≤ 12。
对于 40% 的数据,1 ≤ N, M ≤ 100。
对于 60% 的数据,1 ≤ N, M ≤ 10000。
对于 100% 的数据,1 ≤ N, M ≤ 1000000。

试题 J: 逃跑

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

【问题描述】

小明所在星系有 n 颗星球,编号为 1 到 n。这些星球通过 n − 1 条无向边连成一棵树。根结点为编号为 1 的星球。为了在星际战争到来时逃到其他星系,小明在根结点设置了逃离用的传送门。每个星球的人只需要一直往父结点星球移动就可以抵达根结点。为了方便各个星球的人去往根结点,小明将其中 m 个星球设置为了跳板星球。在从某个星球去往根结点的路径上,当一个人经过任意星球(包括起点星球)时,他可以尝试直接跳跃到 其前往根结点路径上的除当前星球以外的第一个跳板星球,其时间花费和走到父结点星球的时间花费相同,都是 1 单位时间。然而,因为技术问题,向跳板星球的跳跃并不一定成功,每一次跳跃都有p 的概率失败,并转而跳跃到当前星球的父结点星球(相当于直接走到父结点星球);同时此跳板星球失效,将 不再视为跳板星球。为了衡量移动效率,小明想知道,如果一个人在这 n 颗星球中随机选择一颗出发前往根结点,其花费的最短时间的期望是多少单位时间?

【输入格式】

输入共 n + 1 行,第一行为两个正整数 n、m 和一个浮点数 p。
后面 n − 1 行,每行两个正整数 xi, yi 表示第 i 条边的两个端点。
最后一行,共 m 个正整数表示所有跳板星球的编号。

【输出格式】

一行,一个浮点数,表示答案(请保留两位小数)。

【样例输入】

4 1 0.2
1 2
2 3
3 4
2

【样例输出】

1.30

【样例说明】

从 1 号星球出发的时间花费为 0;
从 2 号星球出发的时间花费为 1;
从 3 号星球出发的时间花费为 2;
从 4 号星球出发的时间花费为 0.8 × 2 + 0.2 × 3 = 2.2。
所以期望时间为 0+1+2+2.2
4 = 1.3。

【评测用例规模与约定】

对于 30% 的数据,保证 1 ≤ n ≤ 2000。
对于 100% 的数据,保证 1 ≤ n ≤ 106,1 ≤ m ≤ n,0 < p < 1。

为了计算小蓝能拼出的最大的 $2023$ 的倍数,我们可以使用动态规划的方法。 首先,我们需要找出一个规律。观察 $2023$ 的倍数的末尾几位数,我们可以发现以下规律: - $2023$ 的倍数的末尾 $4$ 位数一定是 $2023$ 的倍数; - $2023$ 的倍数的末尾 $8$ 位数一定是 $2023$ 的倍数; - $2023$ 的倍数的末尾 $12$ 位数一定是 $2023$ 的倍数; - ... 根据这个规律,我们可以得出结论:如果小蓝能够拼出的数字中包含至少 $4$ 个数字 $2$ $7$ 个数字 $3$,那么拼成的整数一定是 $2023$ 的倍数。因为 $4$ 个数字 $2$ $7$ 个数字 $3$ 一共可以成 $11$ 位数,而 $11$ 是 $2023$ 的倍数。 所以,我们的目标是找到满足以上条件的最大的数字。 接下来,我们使用动态规划的思想来解决这个问: 设 $dp[i][j]$ 表示使用 $i$ 个数字 $2$ $j$ 个数字 $3$ 能成的最大整数。其中,$0 \leq i \leq N$,$0 \leq j \leq M$。 我们可以得到以下状态转移方程: $$ dp[i][j] = \max(dp[i-1][j] \times 10 + 2, dp[i][j-1] \times 10 + 3) $$ 最终的答案即为 $dp[N][M]$。 下面是使用 Python 代码实现上述算法: ```python def max_multiple(N, M): dp = [[0] * (M+1) for _ in range(N+1)] # 初始化第一行第一列 for i in range(1, N+1): dp[i][0] = dp[i-1][0] * 10 + 2 for j in range(1, M+1): dp[0][j] = dp[0][j-1] * 10 + 3 # 动态规划求解 for i in range(1, N+1): for j in range(1, M+1): dp[i][j] = max(dp[i-1][j] * 10 + 2, dp[i][j-1] * 10 + 3) return dp[N][M] N = 4 M = 7 result = max_multiple(N, M) print(result) ``` 将 $N$ $M$ 分别替换为目给出的数字,运行代码即可得到结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

想要AC的dly

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值