- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析 - 补充SVG图示,统一试题排版并导出打印PDF - 重整初赛专题训练与复习资料目录,清理旧版源文件
11 KiB
一、单项选择题
答案速查
| 题号 | 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 中。