CSP-J 初赛模拟卷(第 09 套)
参考答案与解析
--- #### **一、单项选择题** **答案速查** | 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | 答案 | D | A | B | C | D | A | A | A | | 题号 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | 答案 | B | C | B | C | B | B | C | **逐题解析** ##### 第1题 **答案:** D **解析:** C 语言属于过程式程序设计语言;其余选项中的 C++、Python 和 Java 均支持面向对象程序设计。 ##### 第2题 **答案:** A **解析:** 存储单元的唯一标识称为地址,CPU 根据地址读写相应的存储单元。 ##### 第3题 **答案:** B **解析:** 广域网的英文为 Wide Area Network,缩写为 WAN;LAN 和 MAN 分别表示局域网和城域网。 ##### 第4题 **答案:** C **解析:** 共有 $2048\times1024$ 个像素,每个像素占 $32/8=4$ 字节。总空间为 $2048\times1024\times4=8\times1024^2$ 字节,即 $8\ \mathrm{MB}$。 ##### 第5题 **答案:** D **解析:** 若先输出 `c`、`d`,则 `a`、`b` 仍在栈中,且 `b` 位于 `a` 上方。在输出 `a` 之前必须先输出 `b`,因此 `c,d,a,e,b` 不合法。 ##### 第6题 **答案:** A **解析:** 折半查找每次将候选范围约减半,最坏比较次数为 $\lfloor\log_2 100\rfloor+1=7$。 ##### 第7题 **答案:** A **解析:** 含 $n$ 个顶点的连通无向图至少有 $n-1$ 条边;取一棵生成树即可达到这个最小值。因此 $10$ 个顶点可用 $9$ 条边构成连通图。 ##### 第8题 **答案:** A **解析:** 先给每个班分配一个名额,再将剩余 $3$ 个相同名额分给 $7$ 个不同班级。由隔板法,方案数为 $\binom{3+7-1}{7-1}=\binom96=84$。 ##### 第9题 **答案:** B **解析:** 高度为 $h$ 的完全二叉树满足 $2^{h-1}\le n\le2^h-1$。因为 $32\le61\le63$,所以高度为 $6$。 ##### 第10题 **答案:** C **解析:** 球和袋子都不可区分,等价于将 $8$ 分拆为至多 $5$ 个正整数。按非空袋子数 $1,2,3,4,5$ 分类,分别有 $1,4,5,5,3$ 种,共 $18$ 种。 ##### 第11题 **答案:** B **解析:** 哈夫曼算法每次选择当前权值最小的两个结点合并,以局部最优选择构造整体最优编码树,属于贪心策略。 ##### 第12题 **答案:** C **解析:** 递归展开为 $7\times\operatorname{solve}(5)=7\times5\times\operatorname{solve}(3)=7\times5\times3\times2=210$。 ##### 第13题 **答案:** B **解析:** 从 `a` 出发的深度优先搜索,最后访问的顶点可以是 `b` 或 `e`,其余两点均不能成为最后访问的顶点,因此共有 $2$ 个。 ##### 第14题 **答案:** B **解析:** 安排用时为 $1$、$2$ 的两人先过河,用时 $1$ 的人返回;再让用时 $4$、$8$ 的两人过河,用时 $2$ 的人返回;最后前两人一起过河。总时间为 $2+1+8+2+2=15$。 ##### 第15题 **答案:** C **解析:** 由辗转相除法,$377=319+58$,$319=5\times58+29$,$58=2\times29$,所以最大公约数为 $29$。 #### **二、阅读程序** ##### 程序(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) **程序分析:** 对每个位置 `i`,程序输出从该位置向右、连续元素均不大于 `a[i]` 的最远端点 `ans`。若当前值比前一个值小,则重新从 `i` 开始寻找。 **答案速查** | 题号 | 22 | 23 | 24 | 25 | 26 | 27 | | :---: | :---: | :---: | :---: | :---: | :---: | :---: | | 答案 | × | √ | √ | √ | D | A | ###### 第22题 **答案:** ×(错误) **解析:** `ans` 至少等于 `i`,但可能恰好等于 `i`;例如严格递增序列中每次输出就是当前位置,因此不保证严格大于。 ###### 第23题 **答案:** √(正确) **解析:** 只有在 `ans 0` | | 36 | `result * x % m` | | 37 | `x * x % m` | | 38 | `result` | ###### 第34题 **答案:** `1` **解析:** 乘法的单位元为 $1$,因此结果累加器初始化为 `1`。 ###### 第35题 **答案:** `p > 0` **解析:** 指数尚未全部处理时继续循环,条件为 `p>0`。 ###### 第36题 **答案:** `result * x % m` **解析:** 当当前二进制位为 $1$ 时,应执行 `result=result*x%m`。 ###### 第37题 **答案:** `x * x % m` **解析:** 指数每次除以二,底数需相应平方并取模,即 `x*x%m`。 ###### 第38题 **答案:** `result` **解析:** 最终所求余数保存在 `result` 中,直接输出即可。 ##### 程序(2) **程序分析:** 程序模拟编号为 $0$ 至 $n-1$ 的约瑟夫环,每隔一名存活者淘汰一人。`F` 标记淘汰状态,`c` 记录已淘汰人数,`p` 在存活者之间交替计数。 **答案速查** | 题号 | 39 | 40 | 41 | 42 | 43 | | :---: | :---: | :---: | :---: | :---: | :---: | | 答案 | D | C | C | D | B | ###### 第39题 **答案:** D(`c < n - 1`) **解析:** 保留一人时结束,因此循环条件为 `c