整理 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,330 @@
<center><font size="6"><b>CSP-J 初赛模拟卷(第 01 套)</b></font></center>
<center><font size="4"><b>参考答案与解析</b></font></center>
---
#### **一、单项选择题**
**答案速查**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | A | A | C | B | B | A | C | D |
| 题号 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | C | B | A | B | B | D | A |
**逐题解析**
##### 第1题
**答案:** A
**解析:** 中国的国家顶级域名为 `.cn`;`.ch` 是瑞士的国家顶级域名。
##### 第2题
**答案:** A
**解析:** C 语言属于过程式程序设计语言;C++、Java 和 C# 均支持面向对象程序设计。
##### 第3题
**答案:** C
**解析:** 先将第一个数作为当前最大值,再依次与其余 $N-1$ 个数比较。每次比较至多排除一个候选最大值,因此至少需要 $N-1$ 次比较。
##### 第4题
**答案:** B
**解析:** 先计算 `b+c`,其后缀表达式为 `bc+`;再与 `a` 相乘,最后与 `d` 相乘,得到 `abc+*d*`。
##### 第5题
**答案:** B
**解析:** 8 位补码的最高位为符号位。该数表示的十进制值为 $-2^7+2^5+2^3+2^1+2^0=-128+32+8+2+1=-85$。
##### 第6题
**答案:** A
**解析:** FTP 是文件传输协议,用于在网络中的计算机之间传输文件。
##### 第7题
**答案:** C
**解析:** 由辗转相除法,$377=319+58$,$319=5\times58+29$,$58=2\times29$,所以最大公约数为 $29$。
##### 第8题
**答案:** D
**解析:** 有 $n$ 个顶点的树恰有 $n-1$ 条边。原图有 $m$ 条边,保留一棵生成树后需删除 $m-(n-1)=m-n+1$ 条边。
##### 第9题
**答案:** C
**解析:** 若先序遍历为 `ACB`,则根为 `A`。由中序遍历 `BAC` 可知 `B` 在左子树、`C` 在右子树,先序遍历必须先访问 `B` 再访问 `C`,与 `ACB` 矛盾。
##### 第10题
**答案:** B
**解析:** 从 `a` 出发,可能的深度优先遍历包括 `a-b-d-c-e`、`a-c-e-d-b` 和 `a-c-d-b-e`。最后访问的顶点只能是 `b` 或 `e`,共有 $2$ 个。
##### 第11题
**答案:** A
**解析:** 从 $A_0$ 进入 $A_1$ 后,$A_1$ 的未访问邻接点 $A_3$ 必须先被访问,不能直接转到与 $A_1$ 不相邻的 $A_2$,因此选项 A 不可能。
##### 第12题
**答案:** B
**解析:** 依次选出三对人员,再除去三支队伍的排列顺序,得到 $\dfrac{\binom62\binom42\binom22}{3!}=15$ 种。
##### 第13题
**答案:** B
**解析:** 根的高度为 $1$ 时,高度为 $h$ 的完全二叉树满足 $2^{h-1}\le n\le2^h-1$。由于 $32\le61\le63$,所以高度为 $6$。
##### 第14题
**答案:** D
**解析:** 代入 $x=\mathrm{true}$、$y=\mathrm{true}$、$z=\mathrm{false}$,A、B、C 均因与 $z$ 进行逻辑与而为假;D 中 $x\land y$ 为真,因此整个逻辑或表达式为真。
##### 第15题
**答案:** A
**解析:** 先从 $5$ 种颜色中选出形成完整手套的 $2$ 种,再从剩余 $3$ 种中选出 $2$ 种,各取一只。单只手套分别有左右手两种选择,因此共有 $\binom52\binom32\times2^2=120$ 种。
#### **二、阅读程序**
##### 程序(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)
**程序分析:** 当 $k>1$ 时,数组 `d` 模拟 $k$ 进制计数,`len` 为有效位数,`ans` 记录进位次数。因此 $\mathrm{ans}=\sum_{t\ge1}\lfloor n/k^t\rfloor$。当 $k=1$ 时应直接分析程序,此时每轮恰有一次进位,最终 `ans=n`。
**答案速查**
| 题号 | 22 | 23 | 24 | 25 | 26 | 27 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | × | × | √ | D | B | D |
###### 第22题
**答案:** ×(错误)
**解析:** 当 $k=1$ 时,第一轮使 `len` 变为 $2$,随后不再增加,因此 `len` 并不总等于 $n$。
###### 第23题
**答案:** ×(错误)
**解析:** 取 $n=1,k=2$,最终 `len=1`,并不小于 $n$,即可构成反例。
###### 第24题
**答案:** √(正确)
**解析:** `len` 是 $n$ 的 $k$ 进制位数,满足 $k^{\mathrm{len}-1}\le n<k^{\mathrm{len}}$,因此该不等式成立。
###### 第25题
**答案:** D
**解析:** $k=1$ 时每次外层循环使 `ans` 加一,执行 $n$ 次后结果为 $n=10^{15}$。
###### 第26题
**答案:** B
**解析:** 进位总数为 $3^{29}+3^{28}+\cdots+1=(3^{30}-1)/2$。
###### 第27题
**答案:** D
**解析:** 按公式依次累加 $\lfloor n/10\rfloor、\lfloor n/10^2\rfloor$ 等,得到 $11112222444453$,对应 D。
##### 程序(3)
**程序分析:** 按题目采用的 32 位补码整数模型,`f(x)` 统计二进制表示中 `1` 的个数,`g(x)=x&(-x)` 提取最低位的 `1` 所代表的数值;程序输出二者之和。
**答案速查**
| 题号 | 28 | 29 | 30 | 31 | 32 | 33 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | × | × | × | √ | × | B |
###### 第28题
**答案:** ×(错误)
**解析:** 数组 `a[1000]` 的合法下标是 $0$ 至 $999$。输入 $n=1001$ 时会访问 `a[1000]`,发生越界。
###### 第29题
**答案:** ×(错误)
**解析:** 零也是反例:`f(0)` 的循环一次也不执行,`g(0)=0`,程序不会因此陷入死循环。
###### 第30题
**答案:** ×(错误)
**解析:** 样例中的最后一个数为 $10$,其二进制为 `1010`,故 `f(10)=2`、`g(10)=2`,最后应输出 $4$,而不是 $5$。
###### 第31题
**答案:** √(正确)
**解析:** $511998$ 的二进制表示有 $16$ 个 `1`,最低位的 `1` 代表 $2$,因此输出 $16+2=18$。
###### 第32题
**答案:** ×(错误)
**解析:** 将 `g` 的定义移到 `main` 后面时,需先在调用前提供函数声明;否则编译器在调用处尚不知道 `g`。
###### 第33题
**答案:** B
**解析:** 32 位补码下,$-65536$ 的二进制表示有 $16$ 个 `1`,最低位的 `1` 为 $65536$,输出 $65552$;$2147483647=2^{31}-1$,输出 $31+1=32$。
#### **三、完善程序**
##### 程序(1)
**程序分析:** 程序先按区间左端点升序排序,再删除被前面区间包含的区间,随后反复选取左端点不超过当前覆盖终点、且能把覆盖范围向右扩展最远的区间,求覆盖目标区间所需的最少区间数。
**答案速查**
| 题号 | 34 | 35 | 36 | 37 | 38 |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | B | D | A | A | B |
###### 第34题
**答案:** B(`A[j].a<A[j-1].a`)
**解析:** 冒泡排序时,若后一个区间的左端点更小,就应与前一个交换,即判断 `A[j].a<A[j-1].a`。
###### 第35题
**答案:** D(`A[j]=A[j-1];A[j-1]=t;`)
**解析:** `t` 已保存 `A[j]`,交换应先执行 `A[j]=A[j-1]`,再执行 `A[j-1]=t`。
###### 第36题
**答案:** A(`A[i].b>A[p-1].b`)
**解析:** 已保留区间的右端点严格递增;只有当前右端点大于最后保留区间的右端点时,才有保留价值。
###### 第37题
**答案:** A(`q+1<n&&A[q+1].a<=r`)
**解析:** 继续检查下一个区间是否存在,且其左端点不超过当前终点 `r`,才能将 `q` 移到最后一个可衔接的区间。
###### 第38题
**答案:** B(`r=max(r,A[q].b)`)
**解析:** `q` 指向当前可用区间中右端点最远者,应使用 `A[q].b` 更新覆盖终点 `r`。
##### 程序(2)
**程序分析:** 程序用两次计数排序完成二关键字排序:先按次关键字 `b` 排序,再稳定地按主关键字 `a` 排序。`ord`、`res` 保存原数据下标,最终按 `a` 优先、`b` 次之输出。
**答案速查**
| 题号 | 39 | 40 | 41 | 42 | 43 |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | B | D | C | A | B |
###### 第39题
**答案:** B(`++cnt[b[i]]`)
**解析:** 第一趟按 `b` 排序,因此应统计每个 `b[i]` 的出现次数,执行 `++cnt[b[i]]`。
###### 第40题
**答案:** D(`ord[--cnt[b[i]]] = i`)
**解析:** 前缀计数确定排序位置,需在 `ord[--cnt[b[i]]]` 中记录原数据下标 `i`。
###### 第41题
**答案:** C(`++cnt[a[i]]`)
**解析:** 第二趟以 `a` 为主关键字,因此统计 `a[i]` 的出现次数。
###### 第42题
**答案:** A(`res[--cnt[a[ord[i]]]] = ord[i]`)
**解析:** 沿第一趟结果逆序扫描,并按 `a[ord[i]]` 放入最终位置,以保持相同 `a` 时原有的 `b` 顺序。
###### 第43题
**答案:** B(`a[res[i]], b[res[i]]`)
**解析:** 最终排列保存在 `res` 中,应输出原数组中下标为 `res[i]` 的二元组。