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

9.9 KiB
Raw Blame History

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

一、单项选择题

答案速查

题号 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] 的二元组。