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

11 KiB
Raw Blame History

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

一、单项选择题

答案速查

题号 1 2 3 4 5 6 7 8
答案 C B B C D D B A
题号 9 10 11 12 13 14
答案 D D C C A A

逐题解析

第1题

答案: C

解析: 操作系统负责管理 CPU、内存、外部设备等硬件资源,并为程序运行和用户操作提供统一的管理与服务。

第2题

答案: B

解析: NOI 是全国青少年信息学奥林匹克竞赛的英文简称。

第3题

答案: B

解析: 队列在队尾插入、队头删除,遵循先进先出原则。

第4题

答案: C

解析: b 位二进制最多表示 2^b 种状态。因为 $2^8=256$,所以至少需要 8 位。

第5题

答案: D

解析: A、B、C 均含有与假值 z 的逻辑与,因此为假。D 中 x\land y 为真,逻辑或的结果为真。

第6题

答案: D

解析: $(269){16}=(617){10}=(1151)_8=617$,而 $(1001101011)_2=619$,所以 D 与其余三项不同。

第7题

答案: B

解析: 按“操作数在前、运算符在后”的规则,b+c 写作 bc+,再依次与 a、d 相乘,得到 abc+*d*。

第8题

答案: A

解析: 若四种花色各至多取 3 张,则总数至多为 12 张。现取 13 张,根据抽屉原理,至少有一种花色取到 4 张。

第9题

答案: D

解析: 前序顺序为“根、左、右”,中序顺序为“左、根、右”。要使两者相同,每个结点都不能有左子树;因此只含根结点或仅沿右孩子延伸的二叉树符合条件。

第10题

答案: D

解析: 按根下标为 $1$、右孩子下标为 2i+1 的规则,图中最右下结点的下标为 $1\to3\to7\to15$,所以最大下标为 $15$。

第11题

答案: C

解析: 只含一种字母的不同非空子串有 3\times3=9 个;跨越 A/B 或 B/C 边界的各有 3\times3=9 个;同时含 A、B、C 的有 3\times3=9 个。共 9+9+9+9=36 个。

第12题

答案: C

解析: 先合并权值 300 和 $400$,得到新结点 $700$。按同权时优先选择合并结点的规则,再合并 600 和这个新结点,最后与原权值 700 合并。“也”所在叶结点的深度为 $3$,编码长度为 $3$。

第13题

答案: A

解析: 将连通图保留为一棵生成树后,边数由 m 变为 $n-1$,需删除 m-n+1 条边。

第14题

答案: A

解析: 删除 p 时,应把前驱的后继指向 p 的后继,把后继的前驱指向 p 的前驱。A 却让这两个相邻结点的相应指针分别指向自身,不能正确连接链表。

二、阅读程序

程序(1)

程序分析: num[i] 表示以第 i 个元素结尾的最长严格递增子序列长度。程序尝试由前面更小的元素转移,最后取所有 num[i] 的最大值。

答案速查

题号 15 16 17 18 19 20
答案 × √ × √ D B
第15题

答案: ×(错误)

解析: 算法只比较元素大小,负数同样可以参与比较,不会仅因输入为负数而出错。

第16题

答案: √(正确)

解析: 长度为 n 的序列,其子序列最多包含 n 个元素,因此 ans<=n。

第17题

答案: ×(错误)

解析: 例如序列 1,2 中,初始两项的 num 都为 $1$;必须允许相等时更新,才能把第二项改为 $2$。改成严格大于后会漏掉这次转移。

第18题

答案: √(正确)

解析: 当 num[i]==ans 时,无论是否再次赋值,ans 的数值都不变,因此修改不影响最大值。

第19题

答案: D

解析: 所有数相等时,不存在严格递增的相邻选取关系,最长严格递增子序列只能取一个元素,输出 $1$。

第20题

答案: B

解析: 样例的动态规划长度依次为 $1,1,2,3,4,3,2,4,5,3$,最大值为 $5$;例如可取 2,5,7,10,15。

程序(2)

程序分析: 利用恒等式 $u+v-(u\mathbin{&}v)=u\mathbin{|}v$,程序在所有数值不相同的元素对中寻找最大的按位或值;若不存在这样的元素对,保留初值 $-1$。

答案速查

题号 21 22 23 24 25 26
答案 × × √ √ C C
第21题

答案: ×(错误)

解析: 数组合法下标为 0 至 $999$,因此输入 n=1000 时仍不会越界;不是必须严格小于 $1000$。

第22题

答案: ×(错误)

解析: 若所有输入值都相同,条件始终不成立,ans 保持为 $-1$,所以输出不一定非负。

第23题

答案: √(正确)

解析: 例如序列 2,1,原循环会处理“较小值在后、较大值在前”的有序对;限制 j=i+1 会漏掉该比较,输出可能改变。

第24题

答案: √(正确)

解析: 按位或具有交换性。把严格小于改为不等于只会同时处理反向的一对,不会改变最大值。

第25题

答案: C

解析: 若出现 $128$,只要与某个不同值配对,其按位或的结果就至少为 $128$;若全部为 128 则输出为 $-1$。两种情况都不可能得到 $127$。

第26题

答案: C

解析: 按位或结果为偶数,说明参与得到该结果的两个数最低位均为零,因此输入中至少有两个偶数。

程序(3)

程序分析: a[x]=y 与 b[y]=x 维护两侧结点的一一配对,冲突配对会先解除。最后分别统计两数组中的零元素;若当前有 t 对配对,输出为 $2n-2t$。

答案速查

题号 27 28 29 30 31 32
答案 √ × × × A A
第27题

答案: √(正确)

解析: 第一对正编号结点必定可以配对,之后的更新不会使配对总数降为零,因此 m>0 时最终至少有一对,输出小于 $2n$。

第28题

答案: ×(错误)

解析: 最终答案为偶数,但某一次执行 ++ans 后的中间值可以是奇数。例如仅配对 (1,2) 时,扫描 i=1 就可能使 ans 变为 $1$。

第29题

答案: ×(错误)

解析: 例如输入配对 (1,2)、(3,1) 后,a[1]=2、b[1]=3,二者可以同时大于零。

第30题

答案: ×(错误)

解析: 例如先后输入 (1,2)、(1,3),每次均有 x<y,但第二次仍须解除旧配对,因此相应语句会执行。

第31题

答案: A

解析: 两侧编号分别互不相同时,所有 m 对都能保留,零元素总数为 $2(n-m)=2n-2m$。

第32题

答案: A

解析: 所有 y 相同时,最终只能保留其中一对配对,故零元素总数为 $2n-2$。

三、完善程序

程序(1)

程序分析: 程序从小到大试除,反复输出同一个质因子并缩小剩余的 n。当试除数超过剩余数的平方根时,若还有大于 1 的剩余数,它本身就是最后一个质因子。

答案速查

题号 33 34 35 36 37
答案 C C C A C
第33题

答案: C(2)

解析: 最小质因子从 2 开始,因此初始化 i=2。

第34题

答案: C(i*i)

解析: 只需试除至平方根,循环条件为 i*i<=n,所以所填表达式为 i*i。

第35题

答案: C(while(n%i==0))

解析: 同一个质因子可能出现多次,必须使用 while(n%i==0) 反复输出并除去。

第36题

答案: A(n>1)

解析: 若试除后 n>1,说明仍剩一个质因子,需要单独输出。

第37题

答案: C(n)

解析: 最后剩下的质因子就是当前的 n,应输出 n。

程序(2)

程序分析: 程序成对枚举 n 的正约数,避免平方根重复加入;随后对每两个不同约数求最大公约数并累加,对 10007 取模。

答案速查

题号 答案
38 i*i
39 n/i
40 return a
41 a%b
42 ans + gcd(a[i], a[j])
第38题

答案: i*i

解析: 枚举到 \sqrt n 即可找到所有约数对,条件写为 i*i<=n。

第39题

答案: n/i

解析: 一对约数为 i 与 n/i。只有 n/i!=i 时才需再加入另一个,避免完全平方数的平方根重复。

第40题

答案: return a

解析: 欧几里得算法中,当第二个参数为零时,第一个参数就是最大公约数,应执行 return a。

第41题

答案: a%b

解析: 递推式为 gcd(a,b)=gcd(b,a%b),第二个参数应为 a%b。

第42题

答案: ans + gcd(a[i], a[j])

解析: 当前约数对的贡献为 gcd(a[i],a[j]),应在原 ans 上累加后再取模。

程序(3)

程序分析: 程序对可切出的整数长度进行二分。长度为 mid 时,第 i 根绳子可切出 len[i]/mid 段;总段数随候选长度增大而不增加,满足二分判定的单调性。

答案速查

题号 答案
43 count = count + len[i]
44 count < m
45 lbound < ubound
46 (lbound + ubound + 1) / 2
47 count = count + len[i] / mid
第43题

答案: count = count + len[i]

解析: 先累加绳子总长度,等价于计算每段长度为 1 时最多能切出的段数。

第44题

答案: count < m

解析: 若总长度仍小于所需段数 m,则即使每段仅长 1 也无法满足要求,应判定失败。

第45题

答案: lbound < ubound

解析: 候选上下界尚未重合时继续二分,故条件为 lbound<ubound。

第46题

答案: (lbound + ubound + 1) / 2

解析: 可行时更新为 lbound=mid,需使用向上取整的中点 (lbound+ubound+1)/2,避免只差 1 时陷入死循环。

第47题

答案: count = count + len[i] / mid

解析: 当前绳子能提供 len[i]/mid 段,应把它累加到总段数 count 中。