1 条题解
-
0
以下是 2023 年 CSP-J 第一轮试题的详细解答与解析:
一、 单项选择题
1. 答案:B
解析:在 C++ 中,const关键字用于声明常量,其值在初始化后不能被修改。unsigned是无符号修饰符,static是静态存储修饰符,mutable用于允许修改const对象中的特定成员。2. 答案:D
解析:八进制加法,逢 8 进 1:12345670 + 07654321 ---------- 22222211从右向左:0+1=1;7+2=9(写1进1);6+3+1=10(写2进1);5+4+1=10(写2进1);4+5+1=10(写2进1);3+6+1=10(写2进1);2+7+1=10(写2进1);1+0+1=2。结果为 。
3. 答案:A
解析:union Data data;声明了一个联合体变量data。访问联合体成员应使用点运算符.,因此正确方式是data.value = 3.14;。4. 答案:A
解析:在链表头部插入新节点的标准操作是:1. 创建新节点并赋值;2. 将新节点的next指向当前的head;3. 将head更新为新节点。即newNode->data = 42; newNode->next = head; head = newNode;。5. 答案:C
解析:高度为 的满三叉树的节点总数公式为 。- 时,
- 时,
- 时, 2023 个节点超过了 7 层的最大容量,因此高度至少为 8。
6. 答案:B
解析:使用插空法或组合数学。设选择了 个时间段,则需要至少 个空闲时间段作为间隔。剩余可自由分配的时间段为 。- : 种
- : 种
- : 种 总方案数 = 种。
7. 答案:C
解析:高精度乘法的时间复杂度与两个整数的位数都有关(朴素算法为 ),而不是只与较长者的位数有关。因此 C 说法错误。8. 答案:A
解析:后缀表达式转中缀表达式,按运算符优先级和结合性加括号:2 3 +(2+3)6 (2+3) -(6-(2+3))8 2 /(8/2)3 (8/2) +(3+8/2)- 两者相乘
((6-(2+3))*(3+8/2)) ^ 2((6-(2+3))*(3+8/2))^2+ 3((6-(2+3))*(3+8/2))^2+3
9. 答案:D
解析:统一转换为十进制计算:- 和 =
- 。
10. 答案:A
解析:构造哈夫曼树:合并 5 和 9 得 14;合并 12 和 13 得 25;合并 14 和 16 得 30;合并 25 和 30 得 55;合并 45 和 55 得 100。 各字符编码长度应为:45(1位), 16(3位), 12(3位), 13(3位), 5(4位), 9(4位)。选项 A 的长度分布 (4, 4, 3, 3, 3, 1) 完全符合,且满足前缀码性质。11. 答案:A
解析:根据前序ABDECFG和中序DEBACFG重建二叉树:- 根为
A。左子树中序DEB,前序BDE根B,D为B的左孩子,E为D的右孩子。左子树后序为EDB。 - 右子树中序
CFG,前序CFG根C,F为C的右孩子,G为F的右孩子。右子树后序为GFC。 - 总后序遍历(左-右-根):
EDB+GFC+A=EDBGFCA。
12. 答案:B
解析:边为 (1,2), (1,3), (2,4), (3,4)。拓扑排序要求 1 必须在 2 和 3 之前,2 和 3 必须在 4 之前。因此合法的排序只能是1, 2, 3, 4或1, 3, 2, 4。选项 B 符合。13. 答案:B
解析:比特 (bit) 是计算机中最小的数据存储容量单位,1 Byte = 8 bit。14. 答案:A
解析:使用“正难则反”法。从 22 人中任选 3 人的总组合数为 。全是男生的组合数为 。至少包含 1 个女生的组合数 = 。15. 答案:D
解析:HTML (HyperText Markup Language) 是一种超文本标记语言,用于创建网页,不是操作系统。Linux, Windows, Android 均为操作系统。
二、 阅读程序
(1) 海伦公式求三角形面积
16. 答案:A (正确)
解析:输入 2, 2, 2,半周长 。面积 $S = \sqrt{3 \times 1 \times 1 \times 1} = \sqrt{3} \approx 1.73205$。程序设置了保留 4 位小数,四舍五入后输出1.7321,正确。17. 答案:A (正确)
解析:实数乘法满足交换律,(s-b)*(s-c)与(s-c)*(s-b)计算结果完全相同,不影响程序运行。18. 答案:B (错误)
解析:题目仅说明“输入的所有数都为不超过1000的正整数”,并未保证这三个数一定能构成三角形。如果输入1 1 3,则 为负数,sqrt函数将返回NaN(Not a Number),此时输出为nan,而不是四位小数。因此“总是”说法错误。19. 答案:A
解析:输入 3, 4, 5,构成直角三角形,面积为 。保留 4 位小数输出6.0000。20. 答案:B
解析:输入 5, 12, 13,构成直角三角形,面积为 。保留 4 位小数输出30.0000。(2) 字符串最长公共子序列 (LCS) 变种
21. 答案:A (正确)
解析:f函数计算的是两个字符串的最长公共子序列 (LCS) 的长度。公共子序列的长度不可能超过参与比较的任何一个字符串的长度,因此必定 。22. 答案:B (错误)
解析:f函数计算的是最长公共子序列 (Subsequence,不要求连续),而不是最长公共子串 (Substring,要求连续)。23. 答案:A (正确)
解析:若输入两个完全相同的字符串 和 (即 ),则 必然包含完整的 作为子序列。因此f(x+x, y)的返回值等于 的长度,g函数返回true。24. 答案:D
解析:二维数组v的维度是(m+1) \times (n+1)。如果将其替换为v[n][m],当 时,行下标 将超出最大合法下标 ,导致数组越界访问,程序可能非正常退出(如段错误)。25. 答案:B
解析:输入x="csp-j",y="p-jcs"。x+x为"csp-jcsp-j"。在x+x中可以按顺序找到y的所有字符:p(idx 2),-(idx 3),j(idx 4),c(idx 5),s(idx 6)。LCS 长度为 5,等于y.size(),g返回true。C++ 中cout << true默认输出1。26. 答案:D
解析:输入x="csppsc",y="spsccp"。x+x为"csppsccsppsc"。在x+x中可以按顺序找到y:s(1),p(2),s(4),c(5),c(6),p(8)。LCS 长度为 6,等于y.size(),g返回true,输出1。(3) 因子平方和计算
27. 答案:A (正确)
解析:solve2函数通过遍历 到 ,找到所有因子对 ,并将它们的平方累加,正是计算 的所有因子的平方和。28. 答案:A (正确)
解析:当 是完全平方数时,。第 13-14 行的if判断确保了这个平方根因子只被累加一次,避免了重复计算。29. 答案:A (正确)
解析:若 为质数,其正因子只有 和 。平方和为 。30. 答案:B
解析:若 ( 为质数),其因子为 。平方和为 。因为 ,代入得 。31. 答案:D
解析:第一项为 的因子平方和,第二项为 ( 的因子平方和) 的平方。- 当 时,第一项 = 1,第二项 = 1,差值 = 0。
- 当 时,第一项 =
solve2(4)= ;第二项 =solve1(solve2(2))=solve1(1^2+2^2)=solve1(5)= 25。差值 = 21 - 25 = -4 < 0。 因此差值小于等于 0 且不一定小于 0。
32. 答案:C
解析:输入 。- 第一项:
solve2(25)。25 的因子为 1, 5, 25。平方和 = 。 - 第二项:
solve1(solve2(5))。5 的因子为 1, 5。平方和 = 。solve1(26)= 。 输出为651 676。
三、 完善程序
(1) 寻找被移除的元素
33. 答案:B
解析:在未缺失的连续部分,应满足nums[i] == nums[0] + i。因此 ① 处填nums[0]。34. 答案:A
解析:若nums[mid] == mid + nums[0],说明mid及之前的元素都是连续的,缺失的元素必然在mid的右侧,故left = mid + 1。35. 答案:C
解析:若不相等,说明缺失发生在mid或mid之前,故右边界收缩为right = mid。36. 答案:A
解析:循环结束时left == right,指向第一个发生偏移的位置。该位置原本应有的值为left + nums[0]。37. 答案:D
解析:如果移除的是首尾元素,数组依然保持连续,二分查找会一直向右推进,最终left停在n-1,返回值为n-1 + nums[0],这恰好等于数组的最后一个元素nums[n-1]。因此判断连续的条件是missing_number == nums[n-1]。(2) 编辑距离 (动态规划)
38. 答案:A
解析:当i == 0时,str1为空串,要变成str2的前j个字符,需要j次插入操作。故 ① 填j。39. 答案:B
解析:当j == 0时,str2为空串,str1的前i个字符要变成空串,需要i次删除操作。故 ② 填i。40. 答案:A
解析:当两个字符相等时,不需要额外操作。C++ 字符串下标从 0 开始,长度为i的前缀的最后一个字符是str1[i-1]。故 ③ 填str1[i-1] == str2[j-1]。41. 答案:B
解析:字符相等时,当前编辑距离等于去掉这两个字符后的子问题的编辑距离,即dp[i-1][j-1]。故 ④ 填dp[i-1][j-1]。42. 答案:C
解析:字符不相等时,取删除 (dp[i-1][j])、插入 (dp[i][j-1])、替换 (dp[i-1][j-1]) 三种操作的最小值加 1。外层已有1 +,故 ⑤ 填dp[i-1][j-1]。
- 1
信息
- ID
- 7850
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 246
- 已通过
- 6
- 上传者