1 条题解

  • 0
    @ 2026-9-6 20:54:55

    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

    因此表达式的值为 1+13=11+1-3=-1,选择 D。

    第 3 题

    答案:D

    原卷映射:1.3。

    数组名 a 在该表达式中退化为首元素地址 &a[0]。指针向后移动 7 个元素,a+7 正好等于 &a[7],所以选 D。

    *a+7 是整数 a[0]+7a+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。

    ppqq 各设一个向后的游标。每走一步,检查从 pp 出发的游标是否到达原结点 qq,以及从 qq 出发的游标是否到达原结点 pp

    位于前面的结点沿后继指针恰好走 dd 步就会到达另一个结点。因此只需 O(d)O(d) 时间和 O(1)O(1) 额外空间,不必从表头走完整条链,选择 B。

    第 7 题

    答案:C

    原卷映射:1.7。

    分别转换为十进制:

    (2026)8=2×83+2×8+6=1046,(2026)_8=2\times8^3+2\times8+6=1046, (2026)16=2×163+2×16+6=8230,(2026)_{16}=2\times16^3+2\times16+6=8230,

    (10 0000 0000 0000)2=213=8192(10\ 0000\ 0000\ 0000)_2=2^{13}=8192。所以结果为 1046+82308192=10841046+8230-8192=1084,选择 C。

    第 8 题

    答案:B

    原卷映射:1.8。

    参数 m 以引用传递,所有递归层修改的是同一个变量。递归先到 f(0,m),它返回 0,此时 m=0m=0

    随后逐层回溯:f(1,m) 返回 1;f(2,m)m=1m=1 并返回 3;f(3,m)m=4m=4 并返回 7;f(4,m)m=11m=11 并返回 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。

    六个下标任选三个共有 (63)=20\binom63=20 种。唯一重复字母是两个 u;不合法的子序列必须同时选中这两个位置,再从其余 4 个位置任选一个,共 4 种。

    所以没有重复字母的长度 3 子序列共有 204=1620-4=16 个。原卷没有 16,故选 D。

    第 11 题

    答案:C

    原卷映射:1.11。

    所有区间状态 (l,r)(l,r) 的数量为 n(n+1)/2=O(n2)n(n+1)/2=O(n^2)。每个非空状态只比较两个子状态并加上一个权值,单次转移为 O(1)O(1),所以求出 f(1,n)f(1,n) 的时间复杂度为 O(n2)O(n^2),C 正确。

    A 错在计算顺序取决于具体实现。自底向上和记忆化搜索可以采用不同访问顺序,两个无依赖关系的状态没有固定先后。

    B 也不成立。任意递推链最多累加 nn 个不超过 10610^6 的权值,因此 f(1,n)500×106f(1,n)\le500\times10^6,没有超过 32 位有符号整数上限。

    D 中,增大 w1,3w_{1,3} 虽会增大 f(1,3)f(1,3),但外层 max 可能一直选择不经过该状态的另一分支。例如使 f(2,4)f(2,4) 仍大于修改后的 f(1,3)f(1,3),则 f(1,4)f(1,4) 不变。

    第 12 题

    答案:B

    原卷映射:1.12。

    为了最大化正数结果,依次选择初值 7、乘 2、减 3、除以 0.2、除以 2。中间值依次为 7,14,11,557,14,11,55

    变量 xint,最后的 55/255/2 截断为 27。因此最大输出是 27,选择 B。

    第 13 题

    答案:C

    原卷映射:1.13。

    g[u] 只保存从 uu 出发的边,所以 g[u].size() 是出度,不是有向图结点的总度数,A 不严谨。

    g[x][y] 把结点编号 yy 当成 vector 下标,不能表示“查找终点 y”,还可能越界。添加边 xyx\to y 的正确写法是 g[x].push_back(y);,所以选 C。

    n=105n=10^5 时,下标 1~100000 都在 g[100001] 范围内;50 万条边由各个 vector 动态保存,D 所说的必然溢出不会发生。

    第 14 题

    答案:B

    原卷映射:1.14。

    条件等价于:每个不超过 100 的合数都必须与 mm 有公因子。任意这样的合数都有一个不超过其平方根、因而不超过 10 的素因子,只可能是 2、3、5、7 之一。

    420=22×3×5×7420=2^2\times3\times5\times7 含有这四个素因子,所以满足条件。480 不含因子 7,取 x=49x=49 即违例;2026 不含因子 3,取 x=9x=9 即违例。

    第 15 题

    答案:A

    原卷映射:1.15。

    三个顶点把正十边形圆周分成三段。设三段跨越的边数为正整数 a,b,ca,b,c,则 a+b+c=10a+b+c=10。旋转和翻折只改变三段的排列,因此只需统计 10 分拆成三个正整数的无序方案。

    这些方案是 (1,1,8)(1,1,8)(1,2,7)(1,2,7)(1,3,6)(1,3,6)(1,4,5)(1,4,5)(2,2,6)(2,2,6)(2,3,5)(2,3,5)(2,4,4)(2,4,4)(3,3,4)(3,3,4)。跨度为 kk 的弦长是 2Rsin(kπ/10)2R\sin(k\pi/10),只会把 kk10k10-k 对应为同一长度;把跨度规范为 min(k,10k)\min(k,10-k) 后,八组依次变为 (1,1,2)(1,1,2)(1,2,3)(1,2,3)(1,3,4)(1,3,4)(1,4,5)(1,4,5)(2,2,4)(2,2,4)(2,3,5)(2,3,5)(2,4,4)(2,4,4)(3,3,4)(3,3,4),仍两两不同。因此恰有 8 类,选择 A。

    二、阅读程序

    程序 1 的功能与维护量

    trans 从低位到高位读取 xx 的二进制位。第 ii 轮的 p 等于 3i3^i;若第 ii 个二进制位为 1,就把 3i3^i 加入 ans

    x=bi2ix=\sum b_i2^i,其中 bi{0,1}b_i\in\{0,1\},函数返回 bi3i\sum b_i3^i。因此返回值的三进制数位序列正好是 xx 的二进制数位序列。

    循环中,x 保存尚未处理的高位,p 是当前三进制位权,ans 是已处理低位的贡献。每右移一次就处理一个原二进制位,单次调用时间为 O(logx)O(\log x)、空间为 O(1)O(1)

    第 16 题

    答案:A(正确)

    原卷映射:2.1.1-1。

    由程序模型,二进制位 bib_i 被原样放到三进制第 ii 位。每位仍然只是 0 或 1,不会产生进位,所以两种进制表示具有相同的数字序列。

    第 17 题

    答案:A(正确)

    原卷映射:2.1.1-2。

    xx 末尾有 kk 个连续二进制 1。加 1 后,这 kk 位清零,第 kk 位由 0 变为 1,因此 trans 的变化量为

    $$3^k-\sum_{i=0}^{k-1}3^i =3^k-\frac{3^k-1}{2} =\frac{3^k+1}{2}>0.$$

    所以在 x+1x+1 仍处于合法范围时,函数值严格增加。

    第 18 题

    答案:B(错误)

    原卷映射:2.1.1-3。

    公式 (3t1)/2(3^t-1)/2 只适用于这些 1 恰好占据最低 tt 位的情况。一般情况下,结果还取决于每个 1 的位置。

    例如 x=2=(10)2x=2=(10)_2 只有一个数位为 1,但 trans(2)=3,而题中公式给出 1,因此判断错误。

    第 19 题

    答案:A(正确)

    原卷映射:2.1.1-4。

    改成 p <<= 1 后,第 ii 轮的 p 等于 2i2^i。此时 ans 变为 bi2i\sum b_i2^i,恰好恢复原整数 xx,所以每个输入数都会原样输出。

    第 20 题

    答案:B

    原卷映射:2.1.2-5。

    依次转换:0 映成 0,1 映成 1,2=(10)22=(10)_2 映成 (10)3=3(10)_3=35=(101)25=(101)_2 映成 (101)3=10(101)_3=1010=(1010)210=(1010)_2 映成 (1010)3=30(1010)_3=30

    输出为 0 1 3 10 30,选择 B。

    第 21 题

    答案:B

    原卷映射:2.1.2-6。

    trans 严格递增,最大输入 1023 的十个二进制位全为 1。因此最大值为

    1+3++39=31012=29524.1+3+\cdots+3^9=\frac{3^{10}-1}{2}=29524.

    选择 B。59049 是 3103^{10},不是十个三进制位全为 1 的数值。

    程序 2 的功能与维护量

    程序先按右端点升序排列区间,右端点相同时按左端点降序。check(d) 维护最近一个已选区间的右端点 last,只有当前区间满足 lilast+dl_i\ge last+d 时才选它。

    在所有当前可选区间中,最早结束的区间给后续留下的空间最大,因此按最小右端点贪心能取得最多区间。cnt>=k 就表示间距 dd 可行。

    较大的 dd 可行时,较小的 dd 必然也可行。主程序利用这一单调性二分最大可行值。若 C=maxriminliC=\max r_i-\min l_i,总时间为 O(nlogn+nlogC)O(n\log n+n\log C),空间为 O(n)O(n)

    第 22 题

    答案:A(正确)

    原卷映射:2.2.1-1。

    比较函数先比较 r,右端点不同时令较小者在前;右端点相同时返回 x.l > y.l,即左端点较大的在前。题目叙述与代码完全一致。

    第 23 题

    答案:A(正确)

    原卷映射:2.2.1-2。

    若一组 kk 个区间满足相邻间距至少为 dd,同一组区间自然也满足至少为 d1d-1。而 check 的贪心能判断该阈值下是否可选到 kk 个区间。

    因此 check(d) 为真必然推出 check(d-1) 为真,这正是二分所需的单调性。

    第 24 题

    答案:C

    原卷映射:2.2.2-3。

    d=3d=3 时,可以依次选择 [1,3][1,3][7,9][7,9][12,15][12,15],因为 73+37\ge3+3129+312\ge9+3,恰好得到 3 个区间。

    d=4d=4 时,只能选到 [1,3][1,3][7,9][7,9];最后一段不满足 129+412\ge9+4。因此最大可行值是 3,选择 C。

    第 25 题

    答案:C

    原卷映射:2.2.2-4。

    排序一次需要 O(nlogn)O(n\log n)。二分进行 O(logC)O(\log C) 轮,每轮的 check 都扫描全部 nn 个区间,因此检查部分共 O(nlogC)O(n\log C)

    总时间为 O(nlogn+nlogC)O(n\log n+n\log C),选择 C。选项 B 漏掉了每次检查中的线性扫描。

    第 26 题

    答案:C

    原卷映射:2.2.2-5。

    改成严格大于后,d=2d=2 时仍可选 [1,3][1,3][7,9][7,9][12,15][12,15],因为 7>3+27>3+212>9+212>9+2

    d=3d=3 时,最后一步要求 12>9+312>9+3,等号不能通过,只能选到两个区间。因此最大输出为 2,选择 C。

    程序 3 的功能与维护量

    insert_node 建立二叉搜索树:小于当前值进入左子树,大于或等于当前值进入右子树。因此重复值总向右插入。

    dfs 维护三类信息:height 是访问过的最大深度;sz[u] 在两棵子树处理后计算为以 uu 为根的子树大小;leaves 统计没有儿子的结点。

    find_node 按同一比较规则查找,遇到第一个相等值立即返回。因此有重复值时,它返回搜索路径上最靠上的那个值。

    设树高为 hh,一次插入或查询为 O(h)O(h)。建树最坏 O(n2)O(n^2)、全部查询最坏 O(qn)O(qn)dfsO(n)O(n);在 n,q1000n,q\le1000 下可以直接运行。

    第 27 题

    答案:A(正确)

    原卷映射:2.3.1-1。

    严格递增序列中的每个新值都进入右子树,树退化为长度 nn 的右链。根的深度为 1,最深结点的深度为 nn;只有链尾是叶子。

    所以第二行输出 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。

    最长路径是 42234\to2\to2\to3,高度为 4;叶子是 3 和 5,共 2 个。程序输出 3 64 2,选择 B。

    第 31 题

    答案:B

    原卷映射:2.3.2-5。

    查找遇到第一个等于 xx 的结点就停止。按插入规则,这个结点的左子树只可能含严格小于 xx 的值,因此其中一定不存在另一个 xx,B 正确。

    返回结点不是最后插入的同值结点;当 xx 只出现一次时,右子树也未必含 xx;当前结点还可以拥有更小值构成的左儿子。因此 A、C、D 都不保证成立。

    第 32 题

    答案:B

    原卷映射:2.3.2-6。

    二叉搜索树按非递减顺序输出应采用中序遍历:先访问左子树,再输出当前结点,最后访问右子树。

    Position B 恰好位于两次递归调用之间,所以选择 B。重复值虽然在右侧,但中序输出仍然是非递减序列。

    三、完善程序

    数轴上的饼干:双指针含义

    排序后,l 指向尚未取走的左侧饼干中坐标最大的一个,r 指向右侧饼干中坐标最小的一个。初始化时,r 应是第一个非负坐标,l=r-1

    每一步只有 a[l]a[r] 可能最近,因为更左或更右的点距离不会更小。若两侧距离相等,题意要求选择坐标较小的左侧。

    取走一侧后,应先把 pos 更新为当前候选,再把该侧指针向外移动。排序需要 O(nlogn)O(n\log n),双指针扫描为 O(n)O(n),总空间为 O(n)O(n)

    第 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 状态设计

    仅用坐标不足以描述搜索状态,因为到达同一格时,“是否已经拆过墙”会影响以后还能否进入 #。因此状态是 (x,y,used)(x,y,used),其中 used{0,1}used\in\{0,1\}

    这里无需再记录“具体拆过哪一堵墙”。所有移动代价均为正,任一最短路线若含有环,都可以删去该环而得到更短路线;所以最短路线可取简单路径,离开已经拆开的墙格后不需要再次进入它。只记录是否已经消耗拆墙机会就足够。

    dista[x][y][used] 记录对应状态的最短距离。每步代价都是 1,使用 BFS 后,某状态第一次被访问时就得到其最短距离。

    扩展相邻格时先排除越界。若下一格是墙且 used=1,就不能再进入;否则,新状态等于原状态加上“下一格是否为墙”。

    终点可能由未拆墙或已拆墙两类状态到达,答案应取存在的最小值。状态数不超过 2nm2nm,每个状态检查四个方向,时间和空间均为 O(nm)O(nm)

    第 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

    2026 云斗学院软件能力认证第一轮(YDSP - Junior)入门级 C++ 语言试题

    信息

    ID
    309
    时间
    1000ms
    内存
    256MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者