1 条题解
-
0
Guest
-
0
完整解释
二、阅读程序
(1)
- 程序分析:
countSetBits函数通过n &= (n - 1)这个位运算技巧来高效地计算整数n的二进制表示中1的个数。这个操作每次会消除二进制表示中最右边的一个1。main函数从1遍历到n,寻找并输出第一个二进制中恰好有k个1的数。 - 题目解析:
- 判断题 (真):这是该函数的精确功能。
- 判断题 (假):该操作清除的是最右边(最低位)的
1,而非最左边。 - 判断题 (真):循环次数等于
1的个数,所以复杂度与1的个数成正比。 - 选择题 (C):
for循环中的break语句确保了程序在找到第一个满足条件的数后就立即停止,因此找到的是最小值。 - 选择题 (A):程序寻找
1到100中1的个数为3的最小整数。按顺序列举:3(11₂)有2个1,5(101₂)有2个1,6(110₂)有2个1,7(111₂)有3个1。因此,第一个找到的数是7。
(2)
- 程序分析:程序使用带记忆化的递归来计算从
n x m网格的左上角到右下角的路径数,其中每一步只能向右或向下。这是一个经典的动态规划问题。 - 题目解析:
6. 判断题 (真):
countPaths是递归函数,dp数组用于存储中间结果,避免重复计算,这是记忆化的定义。 7. 判断题 (真):从(0,0)到(r,c)总共需要走r+c步,其中包含r次向下和c次向右。问题等价于在r+c步中选择r步向下,方案数为组合数 C(r+c, r)。 8. 判断题 (假):递归必须基于当前状态(r, c)进行,调用其子问题(r-1, c)和(r, c-1)。使用固定的n, m是错误的。 9. 选择题 (C):这是该问题的标准描述。 10. 选择题 (A):求从(0,0)到(3,2)的路径数。结果为 C(3+2, 3) = C(5, 3) = 10。
(3)
- 程序分析:程序实现了“康托展开”的逆过程,用于生成
n个不同元素('A' 起始的字母)构成的所有排列中,字典序第k小的那个。它通过阶乘来确定每一位应该选择哪个字符。 - 题目解析:
11. 判断题 (假):阶乘用于计算子问题的排列总数,并非用于计算组合数。
12. 判断题 (真):
erase操作确保了每个字符在排列中只出现一次,是生成正确排列的关键。 13. 判断题 (真):long long的范围有限,当n超过 20 时,fact[i]会溢出,导致计算错误。 14. 选择题 (C):这是该算法的精确功能。 15. 选择题 (B):对于输入4 10,k减 1 后为 9 (0-indexed)。 * 第1位:9 / 3! = 9 / 6 = 1,选择第1个字符 'B'。k = 9 % 6 = 3。 * 第2位:3 / 2! = 3 / 2 = 1,选择剩余字符中的第1个 'C'。k = 3 % 2 = 1。 * 第3位:1 / 1! = 1 / 1 = 1,选择剩余字符中的第1个 'D'。k = 1 % 1 = 0。 * 第4位:0 / 0! = 0 / 1 = 0,选择剩余字符中的第0个 'A'。 * 组合起来为 "BCDA"。
三、完善程序
(1) 统计岛屿数量
- 程序分析:
main函数遍历网格,遇到'1'则计数器加一,并调用bfs函数。bfs函数通过广度优先搜索将与起点相连的所有'1'都变为'0'(淹没岛屿),从而防止重复计数。 - 题目解析:
16. A: 将起点加入队列后,应立刻标记为已访问(变为
'0'),防止被邻居再次入队。 17. A: BFS 循环的条件是队列不为空。 18. A: 在访问网格前必须进行严格的边界检查,确保坐标(nr, nc)在[0, m-1] x [0, n-1]范围内。 19. C: 当找到一个合法的陆地邻居并将其入队时,也应立刻标记为已访问(变为'0')。 20. D: 主函数中调用的是名为bfs的淹没函数。
(2) 互质数对统计
- 程序分析:程序使用双重循环生成所有满足
i < j的数对,并调用gcd函数判断它们是否互质(最大公约数为1)。gcd函数本身是欧几里得算法的递归实现。 - 题目解析:
21. C:
gcd(a, b)的递归出口是当b等于0时,最大公约数为a。 22. D: 欧几里得算法的递归步骤是gcd(a, b)等于gcd(b, a % b)。 23. C: 为满足i < j的约束,内层循环的起始值应为i + 1。 24. A: 判断i和j是否互质,需要计算gcd(i, j)的值。
- 程序分析:
- 1
信息
- ID
- 9964
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者