CSP-J 初赛模拟卷(第 03 套)
参考答案与解析
---
#### **一、单项选择题**
**答案速查**
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | A | B | A | D | D | C | C | B |
| 题号 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | C | D | C | A | C | A | C |
**逐题解析**
##### 第1题
**答案:** A
**解析:** 将 A 化简为 $P\lor[\neg P\land(Q\lor\neg Q)]=P\lor\neg P=\mathrm{true}$,所以它是恒真式。
##### 第2题
**答案:** B
**解析:** 8 位补码的最高位为符号位。该数表示的十进制值为 $-2^7+2^5+2^3+2^1+2^0=-128+32+8+2+1=-85$。
##### 第3题
**答案:** A
**解析:** $(11.01)_2=1\times2^1+1\times2^0+0\times2^{-1}+1\times2^{-2}=3.25$。
##### 第4题
**答案:** D
**解析:** 降低浮点数精度时,舍入可能使数值变大、变小或保持不变,但不会把正数变为负数,或把负数变为正数。
##### 第5题
**答案:** D
**解析:** “存储程序”是冯·诺依曼体系结构的核心思想,即将程序指令与数据存放在存储器中,由计算机依次取指执行。
##### 第6题
**答案:** C
**解析:** 每次切换大小写后输出 `A、S、D` 或 `a、s、d`,每 $6$ 个字符循环一次。$81\bmod6=3$,因此第 $81$ 个字符是大写 `D`。
##### 第7题
**答案:** C
**解析:** 只含一种字母的不同非空子串有 $3\times3=9$ 个;跨越 `A/B` 或 `B/C` 边界的各有 $3\times3=9$ 个;同时含 `A、B、C` 的有 $3\times3=9$ 个。共 $9+9+9+9=36$ 个。
##### 第8题
**答案:** B
**解析:** 广度优先搜索按距起点的层次逐层扩展,先发现的结点先被扩展,因此通常使用先进先出的队列。
##### 第9题
**答案:** C
**解析:** 在搜索引擎中给关键词加双引号,通常表示按完整词组进行精确匹配。
##### 第10题
**答案:** D
**解析:** 选项 D 对四个关键字依次得到 $\lfloor\sqrt2\rfloor=1$、$\lfloor\sqrt6\rfloor=2$、$\lfloor\sqrt{10}\rfloor=3$、$\lfloor\sqrt{17}\rfloor=4$,不发生地址冲突。
##### 第11题
**答案:** C
**解析:** 按递归条件展开:`solve(7)=7*solve(5)`,`solve(5)=5*solve(3)`,`solve(3)=3*solve(2)`,`solve(2)=2*solve(1)`。因此结果为 $7\times5\times3\times2=210$。
##### 第12题
**答案:** A
**解析:** 先把元素两两比较,每对的较大者参与最大值比较,较小者参与最小值比较。偶数个元素需 $3N/2-2$ 次,奇数个元素需 $3(N-1)/2$ 次,统一表示为 $\lceil3N/2\rceil-2$。
##### 第13题
**答案:** C
**解析:** 先求四人生日月份互不相同的概率,再取补集:$1-\dfrac{12\times11\times10\times9}{12^4}=\dfrac{41}{96}$。
##### 第14题
**答案:** A
**解析:** 前序遍历的首结点 `A` 是根。若左子树根为 `B`,其结点应在后序遍历中形成以 `B` 结尾的连续段 `CB`,因此左子树可以有 `B、C` 两个结点。
##### 第15题
**答案:** C
**解析:** 从 1999 年 10 月 1 日到 2017 年 10 月 1 日相隔 $18\times365+5=6575$ 天,其中包含 2000、2004、2008、2012、2016 年的闰日。$6575\bmod7=2$,由星期日向前推 $2$ 天为星期五。
#### **二、阅读程序**
##### 程序(1)
**程序分析:** `encoder` 先放入 `C、S、P`,再按字母序补齐其余字母;`decoder` 是其逆映射。程序把输入字母按这张逆映射表逐个替换。
**答案速查**
| 题号 | 16 | 17 | 18 | 19 | 20 | 21 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | √ | × | √ | × | A | D |
###### 第16题
**答案:** √(正确)
**解析:** 下标为 `st[i]-'A'`,只有大写字母才能保证下标位于 $0$ 至 $25$ 之间。
###### 第17题
**答案:** ×(错误)
**解析:** 并非每个字母都会变化,例如字母 `Z` 的映射仍为 `Z`,输入 `Z` 就与输出相同。
###### 第18题
**答案:** √(正确)
**解析:** 需要检查是否预先出现的特殊字母 `C、S、P` 都在前三个位置;后续补入的字母小于当前枚举字母,不会造成遗漏,因此修改该检查上界不影响结果。
###### 第19题
**答案:** ×(错误)
**解析:** 只建立前 $16$ 个位置的逆映射会漏掉后续字母,部分输入无法被正确还原,输出可能改变。
###### 第20题
**答案:** A
**解析:** 要输出 `A、B、C`,输入应分别是 `encoder[0..2]`,即 `C、S、P`,因此输入既有 `S` 又有 `P`。
###### 第21题
**答案:** D
**解析:** 输出 `C、S、P` 分别对应输入 `P、R、N`,所以输入既没有 `S`,也没有 `A`。
##### 程序(2)
**程序分析:** 程序先用 Floyd 算法求最短路,再枚举一对顶点,将其间距离设为零并更新最短路,最后取所有无序顶点对距离之和的最小值。
**答案速查**
| 题号 | 22 | 23 | 24 | 25 | 26 | 27 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | × | × | √ | √ | A | A |
###### 第22题
**答案:** ×(错误)
**解析:** Floyd 算法需要把中转顶点 `k` 放在最外层,保证阶段性状态含义;改为 `i,j,k` 后不再具有这一保证,结果可能改变。
###### 第23题
**答案:** ×(错误)
**解析:** 读入边需要 $O(m)$ 时间,后续枚举和更新需要 $O(n^4)$ 时间,整体可写为 $O(m+n^4)$,不能说所有运行步骤都与 $m$ 无关。
###### 第24题
**答案:** √(正确)
**解析:** 在允许的图规模和边权下,最优距离总和也可能大于 $10^7$。若把 `ans` 初始化为该值,取最小值时就可能保留错误的初值。
###### 第25题
**答案:** √(正确)
**解析:** 两次更新分别允许经由顶点 `i` 和 `j`,最终允许的中转顶点集合相同,因此交换这两次更新的顺序不影响结果。
###### 第26题
**答案:** A
**解析:** 对给定图枚举置零的顶点对并计算更新后的无序点对最短路之和,最小结果为 $14$。
###### 第27题
**答案:** A
**解析:** 代码使用“枚举中转点并松弛任意两点距离”的 Floyd 算法。
##### 程序(3)
**程序分析:** DFS 从每个顶点出发枚举不重复顶点的路径,回溯时撤销访问标记,`ans` 记录路径权值之和的最大值,即最长简单路径长度。
**答案速查**
| 题号 | 28 | 29 | 30 | 31 | 32 | 33 |
| :---: | :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | √ | √ | D | B | B | C |
###### 第28题
**答案:** √(正确)
**解析:** 简单无向完全图的所有非对角邻接项都会被输入边覆盖;对角项不会被用于访问已标记的当前顶点,因此可省略这段初始化。
###### 第29题
**答案:** √(正确)
**解析:** 所有起点仍会被完整枚举,改变枚举先后不影响最终取到的最大值。
###### 第30题
**答案:** D
**解析:** 图中两个连通分量各只有一条权值为 $1$ 的边,最长简单路径长度为 $1$。
###### 第31题
**答案:** B
**解析:** 四个顶点的完全图中,每条边权值为 $1$,简单路径至多经过 $3$ 条边,且可以达到,因此输出 $3$。
###### 第32题
**答案:** B
**解析:** 顶点 $4$ 孤立,三角形中最长简单路径可取 $2\to3\to1$,长度为 $20+30=50$。
###### 第33题
**答案:** C
**解析:** 取路径 $3\to1\to4\to2$,长度为 $50+40+60=150$;枚举其他简单路径也不能得到更大值。
#### **三、完善程序**
##### 程序(1)
**程序分析:** 将每名射手指向目标构成出度为 $1$ 的有向图。程序先处理入度为零的树枝,再处理剩余有向环;`w=1` 表示计入存活人数,并沿目标方向交替处理状态。
**答案速查**
| 题号 | 34 | 35 | 36 | 37 | 38 |
| :---: | :---: | :---: | :---: | :---: | :---: |
| 答案 | C | D | D | A | C |
###### 第34题
**答案:** C(`in[a[cur]]--;`)
**解析:** 处理当前结点后,应删除它指向目标的那条边,使目标入度减一,即 `in[a[cur]]--`。
###### 第35题
**答案:** D(`in[a[cur]]==0 | w==1`)
**解析:** 目标入度降为零时可继续处理;当前结点状态为 `w==1` 时也需继续处理其目标。因此条件为 `in[a[cur]]==0 || w==1`;用位或连接两个布尔值时结果也相同。
###### 第36题
**答案:** D(`1-w`)
**解析:** 当前结点与目标结点的状态交替,因此下一层参数为 `1-w`。
###### 第37题
**答案:** A(`dfs(i,1)`)
**解析:** 入度为零的射手可先保留,初始状态取 $1$,故调用 `dfs(i,1)`。
###### 第38题
**答案:** C(`!vis[i]`)
**解析:** 处理完树枝后,尚未访问的结点位于有向环中,应以 `!vis[i]` 判断是否开始处理该环。
##### 程序(2)
**程序分析:** 递归函数为每个子树维护允许的开区间 `(lower_bound,upper_bound)`。当前值必须落在该区间中;左子树上界改为当前值,右子树下界改为当前值,从而验证严格二叉搜索树。
**答案速查**
| 题号 | 答案 |
| :---: | :--- |
| 39 | `cur < upper_bound` |
| 40 | `a[root].right_child` |
| 41 | `cur` |
| 42 | `upper_bound` |
| 43 | `1` |
###### 第39题
**答案:** `cur < upper_bound`
**解析:** 已检查 `cur>lower_bound`,还需检查 `cur