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

9.6 KiB
Raw Blame History

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

一、单项选择题

答案速查

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

逐题解析

第1题

答案: C

解析: ATM 密码验证依据用户掌握的密码信息,不利用人体的生理或行为特征,因此不属于生物特征识别。

第2题

答案: C

解析: 每 4 位二进制数对应 1 位十六进制数,因此 100 位二进制正整数需 \lceil100/4\rceil=25 位十六进制数表示。

第3题

答案: B

解析: C++ 支持类、对象、继承及多态等机制,是支持面向对象程序设计的高级语言。

第4题

答案: C

解析: Wi-Fi 主要用于无线局域网,使终端在较小范围内通过无线方式接入网络。

第5题

答案: A

解析: 选项 A 可化为 $P\lor[\neg P\land(Q\lor\neg Q)]=P\lor\neg P$,其值恒为真。

第6题

答案: D

解析: 降低浮点数精度时,舍入可能使数值变大、变小或保持不变,但不会把正数变为负数,或把负数变为正数。

第7题

答案: C

解析: 前缀表达式对应 $3+2\times(5+12)$,结果为 $3+34=37$。

第8题

答案: C

解析: 图灵奖是计算机科学领域的最高荣誉之一,本题对应选项 C。

第9题

答案: C

解析: 三人的选择相互独立,方案总数为 $\binom42\binom43\binom43=6\times4\times4=96$。

第10题

答案: C

解析: 若先序遍历为 ACB,则根为 A。由中序遍历 BAC 可知 B 在左子树、C 在右子树,先序遍历必须先访问 B 再访问 C,与 ACB 矛盾。

第11题

答案: D

解析: 选项 D 对关键字 2,6,10,17 分别得到地址 $1,2,3,4$,互不相同,因此不会产生冲突。

第12题

答案: B

解析: 先令 s->next=hs,将新结点接到原栈顶之前;再令 hs=s,使栈顶指针指向新结点。

第13题

答案: C

解析: 逆序排列的 5 个数共有 \binom52=10 个逆序对。冒泡排序每次相邻交换恰好减少一个逆序对,因此需要 10 次交换。

第14题

答案: D

解析: 最坏情况下,两数组的元素交错出现。在已经确定前 2n-1 个元素后,剩余最后一个元素可直接放入结果,因此最坏比较次数为 $2n-1$。

第15题

答案: A

解析: A_1 的未访问邻接点为 $A_3$,深度优先搜索不能在访问 A_1 后跳过 A_3 而先访问 $A_2$,因此 A 不可能。

二、阅读程序

程序(1)

程序分析: 程序枚举字符串长度 n 的所有正因数 $i$,检查下标为 i-1 的字符,并对满足 c>='a' 的字符进行减去大小写编码差的转换。可能被修改的位置数等于 n 的正因数个数。

答案速查

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

答案: ×(错误)

解析: scanf("%s",st) 可以读取不含空白的数字、标点等字符,并不限于大小写字母。

第17题

答案: √(正确)

解析: 当 i=0 时,第一次计算 n%i 就会出现除数为零的问题,因此程序不能正常执行。

第18题

答案: ×(错误)

解析: 将循环上界缩小到 \sqrt n 后,会漏掉大于 \sqrt n 的因数对应的位置,因此输出可能改变。

第19题

答案: √(正确)

解析: 大写字母的编码均小于小写字母 a,不满足修改条件,因此字符串保持不变。

第20题

答案: B

解析: 18 的正因数为 $1,2,3,6,9,18$,共 6 个;让这些位置都为小写字母即可使 6 个字符发生变化。

第21题

答案: B

解析: $100000=2^5\times5^5$,正因数个数为 $(5+1)(5+1)=36$。其余三个长度的因数个数分别为 $9、1、8$。

程序(2)

程序分析: 程序模拟长除法,b 保存商的各位,a 保存待除数(余数乘十)。若待除数重复,就找到了循环节;若余数变为零,则小数终止。

答案速查

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

答案: ×(错误)

解析: 当 n==m 且 m!=0 时,整数部分为 $1$、余数为零,可以正常结束,不要求两个输入不同。

第23题

答案: √(正确)

解析: 程序包含整数除法和取模,除数 m 必须非零。

第24题

答案: √(正确)

解析: 循环可因检测到重复待除数而执行 break,也可因余数为零而使 do...while 条件不成立,共有两种退出途径。

第25题

答案: ×(错误)

解析: 例如输入 1 3 时,会出现待除数 $10$,已经大于初始的 $n=1$,因此该限制不成立。

第26题

答案: C

解析: $11/8=1.375$,是有限小数,不需循环节括号,因此输出 1.375。

第27题

答案: D

解析: 输入为 5 13,$5/13=0.\overline{384615}$,输出为 0.(384615),对应 D。

程序(3)

程序分析: 程序随机选择枢轴,划分比枢轴小与不小的元素,并只递归进入包含第 k 小值的部分,是快速选择算法。输入顺序不影响随机枢轴下的平均线性复杂度,但最坏情况仍可退化。

答案速查

题号 28 29 30 31 32 33
答案 × √ B B A D
第28题

答案: ×(错误)

解析: rand()%(R-L+1)+L 的取值范围为闭区间 $[L,R]$,包括左端点 L。

第29题

答案: √(正确)

解析: 两个指针相遇后有 a==b,相应位置的 d[a] 与 d[b] 相同,替换不会改变该判断。

第30题

答案: B

解析: 随机枢轴使平均递归规模按比例缩小,单次划分为线性时间,平均总时间为 $O(n)$。

第31题

答案: B

解析: 随机选择枢轴后,初始数组严格递减也不会使平均复杂度改变,仍为 $O(n)$。

第32题

答案: A

解析: 平均复杂度为 $O(n)$;最坏情况下每次仅排除一个元素,总代价为 $n+(n-1)+\cdots+1=O(n^2)$。

第33题

答案: D

解析: 全部元素相等时,划分不能有效均分。求第 n 小值会逐次缩短一个元素,时间复杂度退化为 $O(n^2)$。

三、完善程序

程序(1)

程序分析: 目标是把前 p 个元素整体移到末尾,保持两部分各自顺序。第一种方法借助辅助数组直接映射位置;第二种方法反复把后半部分当前元素插到前面。

答案速查

题号 答案
34 n-p+i
35 a[i]
36 n
37 i-p+1
38 a[i-p]
第34题

答案: n-p+i

解析: 前 p 个元素应放到辅助数组的最后 p 个位置,第 i 项的新位置为 n-p+i。

第35题

答案: a[i]

解析: 后半段第 i 项应复制原数组当前元素 a[i],并放入 b[i-p]。

第36题

答案: n

解析: 辅助数组填完后,应把全部 n 项复制回原数组,因此循环上界为 n。

第37题

答案: i-p+1

解析: 第 i 项要插入位置 i-p,需把 i-p 至 i-1 的元素右移一位,故倒序移动循环的下界为 i-p+1。

第38题

答案: a[i-p]

解析: 腾出的插入位置是 i-p,应把暂存值写入 a[i-p]。

程序(2)

程序分析: 程序离线按身高排序并建立双向链表,再按进入教室的逆序删除同学。处理第 i 人时,链表中保留的恰是此前进入者,最近身高只可能来自其有序前驱或后继。

答案速查

题号 答案
39 i <= j
40 next_pos[order[i]] = order[i+1]
41 higher = height[next_pos[i]] - height[i]
42 shorter < higher
43 previous[next_pos[i]] = previous[i]
第39题

答案: i <= j

解析: 快速排序的两个扫描指针尚未交错时才能交换,条件为 i<=j。

第40题

答案: next_pos[order[i]] = order[i+1]

解析: 按身高顺序建立右邻链接,当前结点 order[i] 的后继应为 order[i+1]。

第41题

答案: higher = height[next_pos[i]] - height[i]

解析: 若存在更高的后继,与其身高差为 height[next_pos[i]]-height[i],应赋给 higher。

第42题

答案: shorter < higher

解析: 只有更矮者严格更近时才选前驱。相等时题目要求选择更高者,因此条件应为 shorter<higher。

第43题

答案: previous[next_pos[i]] = previous[i]

解析: 删除当前结点后,其后继的前驱需接到当前前驱,执行 previous[next_pos[i]]=previous[i]。