整理 NOI 初赛资料目录并标准化 CSP-J 模拟卷

- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析
- 补充SVG图示,统一试题排版并导出打印PDF
- 重整初赛专题训练与复习资料目录,清理旧版源文件
This commit is contained in:
xiaolinquan committed 2026-11-06 17:50:51 +08:00
1 parent fe5c7ffd58
commit 0af92a68d9
216 files changed
+12743 -1272

No files matched your search

@@ -0,0 +1,338 @@
<center><font size="6"><b>CSP-J 初赛模拟卷(第 13 套)</b></font></center>
<center><font size="4"><b>参考答案与解析</b></font></center>
---
#### **一、单项选择题**
**答案速查**
| 题号 | 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]`。