1 条题解
-
0
2026 YDSP Junior 入门级 C++ 语言试题详细题解
阅读程序部分的判断题统一约定:A 表示“正确”,B 表示“错误”。本卷是客观题整卷,题解按知识点、程序状态和补空语义逐题说明,不提供无意义的整卷参考程序。
答案总表
Hydro 题号 原卷小节 答案 1 1.1 C 2 1.2 D 3 1.3 4 1.4 A 5 1.5 6 1.6 B 7 1.7 C 8 1.8 B 9 1.9 D 10 1.10 11 1.11 C 12 1.12 B 13 1.13 C 14 1.14 B 15 1.15 A 16 2.1.1-1 A(正确) 17 2.1.1-2 18 2.1.1-3 B(错误) 19 2.1.1-4 A(正确) 20 2.1.2-5 B 21 2.1.2-6 22 2.2.1-1 A(正确) 23 2.2.1-2 24 2.2.2-3 C 25 2.2.2-4 26 2.2.2-5 27 2.3.1-1 A(正确) 28 2.3.1-2 B(错误) 29 2.3.2-3 A 30 2.3.2-4 B 31 2.3.2-5 32 2.3.2-6 33 3.1 Blank 1 A 34 3.1 Blank 2 B 35 3.1 Blank 3 A 36 3.1 Blank 4 B 37 3.1 Blank 5 C 38 3.2 Blank 1 D 39 3.2 Blank 2 A 40 3.2 Blank 3 C 41 3.2 Blank 4 A 42 3.2 Blank 5 B 原卷中的三处瑕疵
- 第 4 题要求在结点 1、9、5、2 中比较,选项却列出 1、8、5、9。应严格按题干集合判断,答案是结点 1;不能因为选项中出现结点 8 而改选 B。
- 第 9 题的 A、C 两项完全相同,且正确后序遍历应为
CGFADBHE,四个选项中没有这个结果,所以选择 D。 - 第 10 题的正确计数是 16,原卷没有给出 16,只能选择 D“前三个选项都不对”。
一、基础选择题
第 1 题
答案:C
原卷映射:1.1。
NOI 系列上机赛要求,设备发生故障时应举手,由考务人员处理。选手不得自行关闭或重新启动电脑,因此 C 是明确禁止的行为。其余三项是文字游戏式干扰项,并非这条考场规则所指的操作。
第 2 题
答案:D
原卷映射:1.2。
非零整数转换为
bool都得到真,参与整数加法时真转换为 1,所以前两项分别为 1 和 1。浮点数转int向 0 截断,int(-3.7)=-3。因此表达式的值为 ,选择 D。
第 3 题
答案:D
原卷映射:1.3。
数组名
a在该表达式中退化为首元素地址&a[0]。指针向后移动 7 个元素,a+7正好等于&a[7],所以选 D。*a+7是整数a[0]+7;a+28指向的不是a[7];a+7是临时指针值,不能用&(a+7)得到所求指针。第 4 题
答案:A
原卷映射:1.4。
同一结点的所有祖先都位于一条从根到该结点的链上。结点 1 和 5 都是结点 8 的祖先,而结点 5 的祖先列表 2、3、9 中没有 1,所以 1 不是 5 的祖先,只能是 5 为 1 的祖先。
于是结点 1 比结点 5 更深,结点 5 又比 2、9 更深。严格按题干给出的集合 1、9、5、2,最深的是 1。
原卷选项存在不一致:B 写成了题干集合外的结点 8,同时漏掉结点 2。若擅自把比较集合改成选项集合,就会产生另一个结论;本题必须按题干作答。
第 5 题
答案:A
原卷映射:1.5。
卡片上的数字直接决定归还时刻,相当于按键值把元素投入有限个类别,再按类别顺序收集。整个过程没有相邻交换,也没有反复寻找当前最小值。
这种思想最接近计数排序,因此选 A。
第 6 题
答案:B
原卷映射:1.6。
从 、 各设一个向后的游标。每走一步,检查从 出发的游标是否到达原结点 ,以及从 出发的游标是否到达原结点 。
位于前面的结点沿后继指针恰好走 步就会到达另一个结点。因此只需 时间和 额外空间,不必从表头走完整条链,选择 B。
第 7 题
答案:C
原卷映射:1.7。
分别转换为十进制:
而 。所以结果为 ,选择 C。
第 8 题
答案:B
原卷映射:1.8。
参数
m以引用传递,所有递归层修改的是同一个变量。递归先到f(0,m),它返回 0,此时 。随后逐层回溯:
f(1,m)返回 1;f(2,m)令 并返回 3;f(3,m)令 并返回 7;f(4,m)令 并返回 15。程序最终输出 15,选择 B。
第 9 题
答案:D
原卷映射:1.9。
前序首字符 E 是根。中序为
CBDFGA | E | H,所以右子树只有 H,左子树的前序为BCDAFG、中序为CBDFGA。左子树根为 B,左儿子为 C。B 的右子树根为 D;D 的右侧是以 A 为根的子树,其中 F 是 A 的左儿子,G 是 F 的右儿子。
因此左子树后序为
CGFADB,再接右子树 H 和根 E,完整后序为CGFADBHE。原卷没有该选项,且 A、C 重复为同一个错误字符串,故选 D。第 10 题
答案:D
原卷映射:1.10。
六个下标任选三个共有 种。唯一重复字母是两个
u;不合法的子序列必须同时选中这两个位置,再从其余 4 个位置任选一个,共 4 种。所以没有重复字母的长度 3 子序列共有 个。原卷没有 16,故选 D。
第 11 题
答案:C
原卷映射:1.11。
所有区间状态 的数量为 。每个非空状态只比较两个子状态并加上一个权值,单次转移为 ,所以求出 的时间复杂度为 ,C 正确。
A 错在计算顺序取决于具体实现。自底向上和记忆化搜索可以采用不同访问顺序,两个无依赖关系的状态没有固定先后。
B 也不成立。任意递推链最多累加 个不超过 的权值,因此 ,没有超过 32 位有符号整数上限。
D 中,增大 虽会增大 ,但外层
max可能一直选择不经过该状态的另一分支。例如使 仍大于修改后的 ,则 不变。第 12 题
答案:B
原卷映射:1.12。
为了最大化正数结果,依次选择初值 7、乘 2、减 3、除以 0.2、除以 2。中间值依次为 。
变量
x是int,最后的 截断为 27。因此最大输出是 27,选择 B。第 13 题
答案:C
原卷映射:1.13。
g[u]只保存从 出发的边,所以g[u].size()是出度,不是有向图结点的总度数,A 不严谨。g[x][y]把结点编号 当成vector下标,不能表示“查找终点 y”,还可能越界。添加边 的正确写法是g[x].push_back(y);,所以选 C。当 时,下标 1~100000 都在
g[100001]范围内;50 万条边由各个vector动态保存,D 所说的必然溢出不会发生。第 14 题
答案:B
原卷映射:1.14。
条件等价于:每个不超过 100 的合数都必须与 有公因子。任意这样的合数都有一个不超过其平方根、因而不超过 10 的素因子,只可能是 2、3、5、7 之一。
含有这四个素因子,所以满足条件。480 不含因子 7,取 即违例;2026 不含因子 3,取 即违例。
第 15 题
答案:A
原卷映射:1.15。
三个顶点把正十边形圆周分成三段。设三段跨越的边数为正整数 ,则 。旋转和翻折只改变三段的排列,因此只需统计 10 分拆成三个正整数的无序方案。
这些方案是 、、、、、、、。跨度为 的弦长是 ,只会把 与 对应为同一长度;把跨度规范为 后,八组依次变为 、、、、、、、,仍两两不同。因此恰有 8 类,选择 A。
二、阅读程序
程序 1 的功能与维护量
trans从低位到高位读取 的二进制位。第 轮的p等于 ;若第 个二进制位为 1,就把 加入ans。若 ,其中 ,函数返回 。因此返回值的三进制数位序列正好是 的二进制数位序列。
循环中,
x保存尚未处理的高位,p是当前三进制位权,ans是已处理低位的贡献。每右移一次就处理一个原二进制位,单次调用时间为 、空间为 。第 16 题
答案:A(正确)
原卷映射:2.1.1-1。
由程序模型,二进制位 被原样放到三进制第 位。每位仍然只是 0 或 1,不会产生进位,所以两种进制表示具有相同的数字序列。
第 17 题
答案:A(正确)
原卷映射:2.1.1-2。
设 末尾有 个连续二进制 1。加 1 后,这 位清零,第 位由 0 变为 1,因此
$$3^k-\sum_{i=0}^{k-1}3^i =3^k-\frac{3^k-1}{2} =\frac{3^k+1}{2}>0.$$trans的变化量为所以在 仍处于合法范围时,函数值严格增加。
第 18 题
答案:B(错误)
原卷映射:2.1.1-3。
公式 只适用于这些 1 恰好占据最低 位的情况。一般情况下,结果还取决于每个 1 的位置。
例如 只有一个数位为 1,但
trans(2)=3,而题中公式给出 1,因此判断错误。第 19 题
答案:A(正确)
原卷映射:2.1.1-4。
改成
p <<= 1后,第 轮的p等于 。此时ans变为 ,恰好恢复原整数 ,所以每个输入数都会原样输出。第 20 题
答案:B
原卷映射:2.1.2-5。
依次转换:0 映成 0,1 映成 1, 映成 , 映成 , 映成 。
输出为
0 1 3 10 30,选择 B。第 21 题
答案:B
原卷映射:2.1.2-6。
trans严格递增,最大输入 1023 的十个二进制位全为 1。因此最大值为选择 B。59049 是 ,不是十个三进制位全为 1 的数值。
程序 2 的功能与维护量
程序先按右端点升序排列区间,右端点相同时按左端点降序。
check(d)维护最近一个已选区间的右端点last,只有当前区间满足 时才选它。在所有当前可选区间中,最早结束的区间给后续留下的空间最大,因此按最小右端点贪心能取得最多区间。
cnt>=k就表示间距 可行。较大的 可行时,较小的 必然也可行。主程序利用这一单调性二分最大可行值。若 ,总时间为 ,空间为 。
第 22 题
答案:A(正确)
原卷映射:2.2.1-1。
比较函数先比较
r,右端点不同时令较小者在前;右端点相同时返回x.l > y.l,即左端点较大的在前。题目叙述与代码完全一致。第 23 题
答案:A(正确)
原卷映射:2.2.1-2。
若一组 个区间满足相邻间距至少为 ,同一组区间自然也满足至少为 。而
check的贪心能判断该阈值下是否可选到 个区间。因此
check(d)为真必然推出check(d-1)为真,这正是二分所需的单调性。第 24 题
答案:C
原卷映射:2.2.2-3。
当 时,可以依次选择 、、,因为 、,恰好得到 3 个区间。
当 时,只能选到 和 ;最后一段不满足 。因此最大可行值是 3,选择 C。
第 25 题
答案:C
原卷映射:2.2.2-4。
排序一次需要 。二分进行 轮,每轮的
check都扫描全部 个区间,因此检查部分共 。总时间为 ,选择 C。选项 B 漏掉了每次检查中的线性扫描。
第 26 题
答案:C
原卷映射:2.2.2-5。
改成严格大于后, 时仍可选 、、,因为 且 。
时,最后一步要求 ,等号不能通过,只能选到两个区间。因此最大输出为 2,选择 C。
程序 3 的功能与维护量
insert_node建立二叉搜索树:小于当前值进入左子树,大于或等于当前值进入右子树。因此重复值总向右插入。dfs维护三类信息:height是访问过的最大深度;sz[u]在两棵子树处理后计算为以 为根的子树大小;leaves统计没有儿子的结点。find_node按同一比较规则查找,遇到第一个相等值立即返回。因此有重复值时,它返回搜索路径上最靠上的那个值。设树高为 ,一次插入或查询为 。建树最坏 、全部查询最坏 ,
dfs为 ;在 下可以直接运行。第 27 题
答案:A(正确)
原卷映射:2.3.1-1。
严格递增序列中的每个新值都进入右子树,树退化为长度 的右链。根的深度为 1,最深结点的深度为 ;只有链尾是叶子。
所以第二行输出
n 1,判断正确。第 28 题
答案:B(错误)
原卷映射:2.3.1-2。
交换左右递归顺序只改变访问先后,不改变每个结点最终的左右子树大小。最大深度和叶子数也只依赖树的结构,与先访问哪一侧无关。
查询发生在整次
dfs完成后,使用的仍是同一组最终结果,因此输出不会改变。第 29 题
答案:A
原卷映射:2.3.2-3。
插入后根为 5。左子树根为 3,儿子为 2、4,共 3 个结点;右子树根为 8,儿子为 7、9,也有 3 个结点。
查询 3、8、6 得到
3 3 0。树高为 3,叶子 2、4、7、9 共 4 个,所以第二行是3 4,选择 A。第 30 题
答案:B
原卷映射:2.3.2-4。
第二个 2 被插到第一个 2 的右侧,3 又进入第二个 2 的右侧。因此第一个值为 2 的结点子树包含 2、2、3,大小为 3;根 4 的子树大小为 6。
最长路径是 ,高度为 4;叶子是 3 和 5,共 2 个。程序输出
3 6与4 2,选择 B。第 31 题
答案:B
原卷映射:2.3.2-5。
查找遇到第一个等于 的结点就停止。按插入规则,这个结点的左子树只可能含严格小于 的值,因此其中一定不存在另一个 ,B 正确。
返回结点不是最后插入的同值结点;当 只出现一次时,右子树也未必含 ;当前结点还可以拥有更小值构成的左儿子。因此 A、C、D 都不保证成立。
第 32 题
答案:B
原卷映射:2.3.2-6。
二叉搜索树按非递减顺序输出应采用中序遍历:先访问左子树,再输出当前结点,最后访问右子树。
Position B 恰好位于两次递归调用之间,所以选择 B。重复值虽然在右侧,但中序输出仍然是非递减序列。
三、完善程序
数轴上的饼干:双指针含义
排序后,
l指向尚未取走的左侧饼干中坐标最大的一个,r指向右侧饼干中坐标最小的一个。初始化时,r应是第一个非负坐标,l=r-1。每一步只有
a[l]和a[r]可能最近,因为更左或更右的点距离不会更小。若两侧距离相等,题意要求选择坐标较小的左侧。取走一侧后,应先把
pos更新为当前候选,再把该侧指针向外移动。排序需要 ,双指针扫描为 ,总空间为 。第 33 题
答案:A
原卷映射:3.1 Blank 1。
要让
r停在第一个非负数,应从 0 开始,在下标合法且a[r]<0时递增。因此应填r < n && a[r] < 0。先判断
r<n可以利用短路求值防止越界;当所有数都为负时,循环会安全停在r=n。第 34 题
答案:B
原卷映射:3.1 Blank 2。
只要左侧还有元素,即
l>=0,或者右侧还有元素,即r<n,就仍有饼干需要处理。因此循环条件是l >= 0 || r < n。若使用逻辑与,一侧先耗尽时循环就会提前结束,另一侧的饼干将被遗漏。
第 35 题
答案:A
原卷映射:3.1 Blank 3。
选择左侧首先要求
l>=0。若右侧已经耗尽,即r>=n,只能向左;否则比较当前距离pos-a[l]与a[r]-pos。平局时坐标较小的是左侧,所以必须使用
<=。完整条件为l >= 0 && (r >= n || pos - a[l] <= a[r] - pos)。B 会在平局时错误地选右;C 描述的是偏向右侧的条件;D 比较的是两点到原点的距离,人在移动后就不再适用。
第 36 题
答案:B
原卷映射:3.1 Blank 4。
本轮取走的是当前
a[l],所以应先令pos=a[l],再让l减一。后缀自减pos = a[l--]正好符合这一顺序。前缀自减会先改变下标,跳过当前饼干,并可能在边界处越界。
第 37 题
答案:C
原卷映射:3.1 Blank 5。
向右移动时同理,应先令
pos=a[r],再使r加一。因此应填后缀自增形式pos = a[r++],选择 C。拆墙迷宫:BFS 状态设计
仅用坐标不足以描述搜索状态,因为到达同一格时,“是否已经拆过墙”会影响以后还能否进入
#。因此状态是 ,其中 。这里无需再记录“具体拆过哪一堵墙”。所有移动代价均为正,任一最短路线若含有环,都可以删去该环而得到更短路线;所以最短路线可取简单路径,离开已经拆开的墙格后不需要再次进入它。只记录是否已经消耗拆墙机会就足够。
dista[x][y][used]记录对应状态的最短距离。每步代价都是 1,使用 BFS 后,某状态第一次被访问时就得到其最短距离。扩展相邻格时先排除越界。若下一格是墙且
used=1,就不能再进入;否则,新状态等于原状态加上“下一格是否为墙”。终点可能由未拆墙或已拆墙两类状态到达,答案应取存在的最小值。状态数不超过 ,每个状态检查四个方向,时间和空间均为 。
第 38 题
答案:D
原卷映射:3.2 Blank 1。
所有未访问状态必须初始化为 -1,而且要覆盖整个三维数组
dista。因此应填memset(dista, -1, sizeof(dista))。A 只填两个整数;B 会破坏迷宫内容;C 把未访问状态设为 0,会与起点距离混淆。
第 39 题
答案:A
原卷映射:3.2 Blank 2。
标准 BFS 必须在队列非空时持续取出队首并扩展,所以条件是
!q.empty()。只检查终点某一层的距离可能过早停止,也无法正确处理不可达情形;
q.empty()方向相反,q.size()==1更不能覆盖一般状态。第 40 题
答案:C
原卷映射:3.2 Blank 3。
只有“下一格是墙”且“此前已经拆过一堵墙”时,这次移动才非法。因此跳过条件是
g[nx][ny] == '#' && u.used == 1。当
used=0时,进入第一堵墙必须被允许,否则程序就没有使用拆墙机会的途径。第 41 题
答案:A
原卷映射:3.2 Blank 4。
进入普通格时
used不变;进入墙时它从 0 变为 1。前一步已经排除了used=1再进墙,所以可统一写成u.used + (g[nx][ny] == '#')。若只使用“当前格是不是墙”作为新状态,走回普通格时会把已经使用的拆墙机会错误地清零。
第 42 题
答案:B
原卷映射:3.2 Blank 5。
此处已经知道“用过拆墙机会”的终点距离存在,但
ans=dista[tx][ty][0]仍可能是 -1。若
ans==-1,应直接采用第 1 层距离;否则才取两者最小值。因此正确表达式是ans = (ans == -1 ? dista[tx][ty][1] : min(ans, dista[tx][ty][1]))。直接执行
min(-1,正数)会错误地保留 -1;取最大值也不符合最短路目标。
- 1
信息
- ID
- 309
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者