Files
cpp-courseware/2.Course/5.C++_Exam/NOI/CSP-J 初赛模拟卷/答案解析/CSP-J初赛模拟卷·第04套-答案解析.md
T
xiaolinquan 0af92a68d9 整理 NOI 初赛资料目录并标准化 CSP-J 模拟卷
- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析
- 补充SVG图示,统一试题排版并导出打印PDF
- 重整初赛专题训练与复习资料目录,清理旧版源文件
2026-11-06 17:50:51 +08:00

10 KiB
Raw Blame History

CSP-J 初赛模拟卷(第 04 套)
参考答案与解析

一、单项选择题

答案速查

题号 1 2 3 4 5 6 7 8
答案 D C D B A A C C
题号 9 10 11 12 13 14 15
答案 B B C D A B C

逐题解析

第1题

答案: D

解析: Linux 可执行文件没有统一的默认扩展名;能否执行主要由文件格式及执行权限决定,因此前三项均不符合。

第2题

答案: C

解析: 数组已经有序时,第一趟仍需进行 n-1 次相邻比较。由于没有交换,FLAG 保持为 $1$,外层循环随后结束。

第3题

答案: D

解析: 按字节寻址时,32 位地址总线可表示 2^{32} 个地址,对应 2^{32} 字节,即 $4\ \mathrm{GB}$。

第4题

答案: B

解析: 无向完全图中,每两个不同顶点之间恰有一条边,因此边数为 $\binom72=7\times6/2=21$。

第5题

答案: A

解析: CPU 负责执行运算和控制程序运行。易失性存储器断电后可能丢失数据,屏幕尺寸与分辨率不具有一一对应关系,接入互联网也不限于 Wi-Fi。

第6题

答案: A

解析: 从 A_0 进入 A_1 后,A_1 的未访问邻接点 A_3 必须先被访问,不能直接转到与 A_1 不相邻的 $A_2$,因此选项 A 不可能。

第7题

答案: C

解析: 顺序存储且根下标为 1 时,下标为 i 的结点的左右孩子下标分别为 $2i$、$2i+1$。因此下标为 k 的结点,其父结点下标为 $\lfloor k/2\rfloor$。

第8题

答案: C

解析: IPv4 地址的每一段为 8 位,取值范围是 0 至 $255$。选项 C 中出现了 256,超出了该范围。

第9题

答案: B

解析: 将三进制数按位权展开,可得 $3Z=6X+2Y$。结合数字范围及首位不为零,得到 $X=1,Y=0,Z=2$。于是 $(10)_3\times(21)_3=(210)_3$,对应 ZXY。

第10题

答案: B

解析: 将三个盘子中的苹果数按从大到小排列,可得 $(7,0,0)$、$(6,1,0)$、$(5,2,0)$、$(5,1,1)$、$(4,3,0)$、$(4,2,1)$、$(3,3,1)$、$(3,2,2)$,共 8 种。

第11题

答案: C

解析: 先合并权值 300 和 $400$,得到新结点 $700$。按同权时优先选择合并结点的规则,再合并 600 和这个新结点,最后与原权值 700 合并。“也”所在叶结点的深度为 $3$,编码长度为 $3$。

第12题

答案: D

解析: 递推式展开后为 $T(n)=1+\sum_{i=1}^{n}i=1+n(n+1)/2$,所以时间复杂度为 $O(n^2)$。

第13题

答案: A

解析: 只打开 B、关闭其余阀门时,水能沿对应管道到达果树,且不会从 A 处流失,因此选 A。

第14题

答案: B

解析: $10000=2^4\times5^4$。在 1 至 10000 中,去掉能被 2 或 5 整除的数,并加回被重复扣除的 10 的倍数,得到 10000-5000-2000+1000=4000 个。

第15题

答案: C

解析: 首尾两位及第二、四位分别可取 00、11、88、69、96,各有 5 种选择;中间一位只能取 0、1、8。共有 5\times5\times3=75 种。

二、阅读程序

程序(1)

程序分析: num[i] 表示以第 i 个元素结尾的最长严格递增子序列长度。程序尝试由前面更小的元素转移,最后取所有 num[i] 的最大值。

答案速查

题号 16 17 18 19 20 21
答案 × √ × √ D B
第16题

答案: ×(错误)

解析: 算法只比较元素大小,负数同样可以参与比较,不会仅因输入为负数而出错。

第17题

答案: √(正确)

解析: 长度为 n 的序列,其子序列最多包含 n 个元素,因此 ans<=n。

第18题

答案: ×(错误)

解析: 例如序列 1,2 中,初始两项的 num 都为 $1$;必须允许相等时更新,才能把第二项改为 $2$。改成严格大于后会漏掉这次转移。

第19题

答案: √(正确)

解析: 当 num[i]==ans 时,无论是否再次赋值,ans 的数值都不变,因此修改不影响最大值。

第20题

答案: D

解析: 所有数相等时,不存在严格递增的相邻选取关系,最长严格递增子序列只能取一个元素,输出 $1$。

第21题

答案: B

解析: 样例的动态规划长度依次为 $1,1,2,3,4,3,2,4,5,3$,最大值为 $5$;例如可取 2,5,7,10,15。

程序(2)

程序分析: 每个区间取最小元素为根,递归处理左右区间,最终计算各结点深度与对应 b 值的乘积之和,可视为在最小笛卡尔树上求加权深度和。

答案速查

题号 22 23 24 25 26 27
答案 × √ A D D B
第22题

答案: ×(错误)

解析: 即使最小值重复,程序也会选择扫描到的第一个最小值作为分界点,左右递归区间仍严格缩小,因此重复本身不会导致错误。

第23题

答案: √(正确)

解析: 每个结点的贡献都是 depth*b[mink],当所有 b 均为零时,输出必为零。

第24题

答案: A

解析: 最坏情况下每次最小值都位于端点,扫描次数为 $100+99+\cdots+1=5050$,最接近 $5000$。

第25题

答案: D

解析: 最好情况下形成尽量平衡的树。100 个结点的最小深度和为 $580$,相应扫描总次数也为 $580$,最接近 $600$。

第26题

答案: D

解析: 将权值 1 至 10 依次安排在深度 1 至 10 的链上,可得到最大加权深度和 $1^2+2^2+\cdots+10^2=385$。

第27题

答案: B

解析: 按层尽量填满的树使总深度最小,得到 $1\times1+2\times2+3\times4+4\times8+5\times16+6\times32+7\times37=580$。

程序(3)

程序分析: A[i][j] 由杨辉三角递推得到组合数 \binom ij 对 MOD 取模的值;sum 为该数组的二维前缀和,同样对 MOD 取模。

答案速查

题号 28 29 30 31 32 33
答案 × × × √ C C
第28题

答案: ×(错误)

解析: 对角线元素为 $A[i][i]=\binom ii=1$,并不是零。

第29题

答案: ×(错误)

解析: 该递推计算的是组合数而非排列数,且保存的是组合数对 MOD 取模后的值。

第30题

答案: ×(错误)

解析: 前缀和取模后可能从较大的值回绕到较小值,因此不能保证所述单调关系。

第31题

答案: √(正确)

解析: 在取模前额外加一个 MOD,不会改变对 MOD 取模后的余数。

第32题

答案: C

解析: 前 10 行的最大组合数为 $\binom{10}5=252$,这些值均小于模数,因此无需考虑取模改变数值。

第33题

答案: C

解析: 查询为 sum[5][3],即将前 5 行、前 3 列的组合数求和,结果为 $1+3+7+14+25=50$。

三、完善程序

程序(1)

程序分析: 程序对可切出的整数长度进行二分。长度为 mid 时,第 i 根绳子可切出 len[i]/mid 段;总段数随候选长度增大而不增加,满足二分判定的单调性。

答案速查

题号 答案
34 count = count + len[i]
35 count < m
36 lbound < ubound
37 (lbound + ubound + 1) / 2
38 count = count + len[i] / mid
第34题

答案: count = count + len[i]

解析: 先累加绳子总长度,等价于计算每段长度为 1 时最多能切出的段数。

第35题

答案: count < m

解析: 若总长度仍小于所需段数 m,则即使每段仅长 1 也无法满足要求,应判定失败。

第36题

答案: lbound < ubound

解析: 候选上下界尚未重合时继续二分,故条件为 lbound<ubound。

第37题

答案: (lbound + ubound + 1) / 2

解析: 可行时更新为 lbound=mid,需使用向上取整的中点 (lbound+ubound+1)/2,避免只差 1 时陷入死循环。

第38题

答案: count = count + len[i] / mid

解析: 当前绳子能提供 len[i]/mid 段,应把它累加到总段数 count 中。

程序(2)

程序分析: 程序按字典序生成从 n 个数中选出 m 个数的无重复排列。每次从右向左寻找可增大的位置,释放旧值,再把后缀填成最小的可用排列。

答案速查

题号 答案
39 false
40 used[data[i]] = false
41 j
42 n
43 break
第39题

答案: false

解析: 每轮先假定不存在后继排列,将 flag 置为 false;找到合法增大位置后再改为真。

第40题

答案: used[data[i]] = false

解析: 尝试替换第 i 位之前,必须释放其原值,执行 used[data[i]]=false。

第41题

答案: j

解析: j 是当前找到的更大且尚未使用的数,应赋给 data[i]。

第42题

答案: n

解析: 候选数字范围为 1 至 $n$,因此补后缀时内层枚举上界应为 n。

第43题

答案: break

解析: 已找到并构造出紧邻的下一个排列后,应退出从右向左的扫描,执行 break。