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