1 条题解
-
0
一、 单项选择题
1. 答案:D (8) 解析:
x &= x - 1是经典的位运算操作,用于清除二进制表示中最低位的1。循环次数即为x的二进制中1的个数。,其二进制为11111101010,共包含 8 个1,故循环 8 次,cnt的值为 8。2. 答案:D (102) 解析:构造哈夫曼树的过程是每次选取权值最小的两个结点合并:
- 合并 1, 2 3 (代价 3)。集合变为
- 合并 3, 3 6 (代价 6)。集合变为
- 合并 4, 5 9 (代价 9)。集合变为
- 合并 6, 6 12 (代价 12)。集合变为
- 合并 7, 8 15 (代价 15)。集合变为
- 合并 9, 12 21 (代价 21)。集合变为
- 合并 15, 21 36 (代价 36)。 带权路径长度 (WPL) 等于所有非叶子结点的权值之和:。
3. 答案:C (301) 解析:计算 1 到 1000 中数字 "1" 出现的次数:
- 个位为 1:每 10 个数出现 1 次,共 次。
- 十位为 1:每 100 个数出现 10 次,共 次。
- 百位为 1:每 1000 个数出现 100 次,共 100 次。
- 千位为 1:数字 1000 贡献 1 次。 总计: 次。
4. 答案:D (20) 解析:这是一个部分错排问题。
- 第一步:从 5 封信中选出 2 封装对的信,方案数为 。
- 第二步:剩余的 3 封信必须全部装错(错排),3 个元素的错排数 。
- 总方案数: 种。
5. 答案:A (29) 解析:寻找 的周期。 $3^1=3, 3^2=9, 3^3=27, 3^4=81, 3^5=43, 3^6=29, 3^7=87, 3^8=61, 3^9=83, 3^{10}=49, \dots, 3^{20} \equiv 1 \pmod{100}$。 周期为 20。。 因此 。
6. 答案:C (34) 解析:这是经典的区间 DP(石子合并)。设 为合并第 到第 堆的最小代价, 为前缀和。
- 长度 2:
- 长度 3:;;
- 长度 4:;
- 长度 5:$dp[1][5]=\min(dp[1][1]+dp[2][5], dp[1][2]+dp[3][5], dp[1][3]+dp[4][5], dp[1][4]+dp[5][5]) + 15 = \min(0+21, 5+15, 12+7, 20+0) + 15 = \min(21, 20, 19, 20) + 15 = 19 + 15 = 34$。
7. 答案:A (3 和 4) 解析:
sum(11): 的二进制为1011。访问下标依次为 $11 \rightarrow 11 - \text{lowbit}(11) = 10 \rightarrow 10 - \text{lowbit}(10) = 8$。共访问 3 个下标。add(3, x): 的二进制为0011。访问下标依次为 $3 \rightarrow 3 + \text{lowbit}(3) = 4 \rightarrow 4 + \text{lowbit}(4) = 8 \rightarrow 8 + \text{lowbit}(8) = 16$。共访问 4 个下标。
8. 答案:B (8) (注:原题号标为9,此处按顺序修正为8) 解析:顶点 1 必须在 2 和 3 之前,2 和 3 的相对顺序任意,故 的合法拓扑序有 2 种(1,2,3 和 1,3,2)。孤立点 4 可以插入到这 3 个元素的 4 个空隙中(包括首尾)。总方案数为 种。
9. 答案:A () (注:原题号标为9) 解析:根据递归树分析,每层的代价之和为 。递归树的最深分支由 决定,深度为 。总时间复杂度为 。
10. 答案:D (直径 7,重心为结点 1) 解析:画出树的结构:1 连接 2 和 3;2 连接 4 和 5,5 连接 9;3 连接 6,6 连接 7,7 连接 8。
- 最长路径(直径)为 ,共经过 7 条边,直径为 7。
- 重心是删除该点后,最大连通块最小的点。以 1 为根,其子树大小分别为 4(包含 2,4,5,9)和 4(包含 3,6,7,8),最大子树为 4,是所有结点中最小的,故重心为 1。
11. 答案:C (4) 解析:对于有向无环图(DAG),要使其变为强连通图,至少需要添加的边数为 。本题中入度为 0 的有 3 个,出度为 0 的有 4 个,故至少需要添加 条边。
12. 答案:C (132) 解析: 个结点的不同形态二叉树数量由卡特兰数 给出。$C_6 = \frac{1}{6+1} \binom{2 \times 6}{6} = \frac{1}{7} \times 924 = 132$。
13. 答案:B (6) 解析:字符串 ,长度为 9。寻找既是真前缀又是真后缀的非空子串:
- 长度 2:"ab" == "ab" (匹配)
- 长度 4:"abab" == "abab" (匹配) 其他长度均不匹配。长度之和为 。
14. 答案:C (变为满足 且
a[i]≥a[j]的数对个数) 解析:原代码中a[i] <= a[j]时不统计逆序对。若改为a[i] < a[j],则当a[i] == a[j]时,程序会进入else分支并执行ans += mid - i + 1。这相当于把相等的元素也当作逆序对进行了统计,因此统计结果变成了满足 且 的数对总数。15. 答案:B (376) 解析:快速幂计算 。 $2^{100} = 2^{80} \times 2^{20} \equiv 176 \times 576 = 101376 \equiv 376 \pmod{1000}$。
二、 阅读程序
(1)CRC 校验码计算
16. 答案: (正确) 解析:输入 32 个 '0',数组
a全为 0。循环中if (a[i] == 0) continue;会跳过所有异或操作,最后输出的后 12 位也全为 0。17. 答案: (正确) 解析:该程序模拟了模 2 除法。由于生成多项式
gen的最高位gen[0]为 1,每次遇到a[i] == 1时进行异或,都会将当前的a[i]清零。因此处理完前 32 位后,a[0]到a[31]一定全为 0。18. 答案: (错误) 解析:
a是全局数组,C++ 保证全局变量默认初始化为 0。因此即使删除了显式补 0 的循环,a[32..43]依然是 0,程序的逻辑和输出结果不会发生改变。题目说“会改变”,故该说法错误。19. 答案:C 解析:
gen数组有 13 个元素,代表一个 13 位的生成多项式(除数),其中gen[0]对应最高位( 的系数)。20. 答案:B 解析:程序先将 32 位输入串后补 12 个 0,然后通过模 2 除法(异或操作模拟)除以 13 位的生成多项式,最后输出的正是 12 位的余数(即 CRC 校验码)。
21. 答案:C 解析:删除
continue后,程序依然会按固定逻辑执行完所有循环,不会发生数组越界或崩溃,因此能正常输出 12 位串。但由于每次无条件异或,破坏了原有的条件分支逻辑,其输出结果失去了与原输入串 的有效校验关联。(2)ST 表求区间 GCD
22. 答案: (正确) 解析:查询区间 对应元素 。,程序输出 1,正确。
23. 答案: (正确) 解析:当 时,区间长度为 1,
lg[1] = 0。查询时计算 ,正确。24. 答案: (错误) 解析:一组正整数的最大公约数 (GCD) 一定不大于(小于或等于)这组数中的最小值,而不是“不小于”。
25. 答案:B 解析:ST 表的定义,
dp[i][j]存储的是从下标 开始,长度为 的区间的最大公约数。26. 答案:B 解析:建表过程包含两层循环,外层 从 1 到 ,内层 遍历 个起点,总时间复杂度为 。
27. 答案:D () 解析:根据代码逻辑:
if (pw[t + 1] >= i) lg[i] = t; else { t++; lg[i] = t; }。- 当 时, 成立,
lg[32] = 4。 - 当 时,,进入
else, 变为 5,lg[33] = 5。 - 当 时, 成立,
lg[64] = 5。 - 当 时,, 变为 6,
lg[65] = 6。 故lg[x] = 5的范围是 。
(3)求树的直径
28. 答案: (正确) 解析:输入构成一条链 。逆序遍历更新时,
ans会依次记录经过的边数,最终ans累加到 4,输出 4,正确。29. 答案: (错误) 解析:
f[1]记录的是从根结点 1 向下延伸的最长路径长度,而ans记录的是整棵树的直径。如果树的直径完全位于某个子树中(不经过根结点 1),则ans会大于f[1]。30. 答案: (错误) 解析:原逻辑是先使用旧的
f[fa[i]]更新ans,再更新f[fa[i]]。若交换顺序,更新ans时会使用已经被当前子树更新过的新的f[fa[i]],导致计算出的路径不再是经过fa[i]的两条不相交子树路径之和,逻辑错误。31. 答案:A 解析:该算法是经典的树形 DP 求直径方法。
ans维护的是树中距离最远的两个结点之间路径所经过的边数。32. 答案:C (4) 解析:树的结构为:1 连接 2, 3;2 连接 4, 5;3 连接 6, 7。这是一个深度为 3 的满二叉树。最长路径如 ,共经过 4 条边,直径为 4。
33. 答案:C (256) 解析: 且直径为 9,说明该树必须是一条链。在满足 的约束下构造链:结点 1 固定为端点;结点 2 只能连 1;从结点 3 到结点 10,每个新结点 都可以选择连接到当前已形成链的两个端点之一。因此方案数为 $1 \times 2 \times 2 \dots \times 2 = 2^{10-2} = 2^8 = 256$ 种。
三、 完善程序
(1)平衡路径
34. 答案:C (
op[0] == '+' ? 1 : -1) 解析:后续代码通过w[i] > 0和w[i] < 0来判断图中是否同时存在 '+' 和 '-' 边,因此需要将字符映射为 1 和 -1。35. 答案:D (
hh < tt) 解析:这是标准 BFS 队列的循环条件,当队头指针小于队尾指针时,说明队列非空,继续遍历。36. 答案:B (
d[x] + 1) 解析:BFS 中,未被访问过的相邻结点y的距离等于当前结点x的距离加 1。37. 答案:A (
c[y] == c[x]) 解析:c数组用于二分图染色(0 和 1)。如果相邻结点y已被访问过,且其颜色c[y]与当前结点x的颜色c[x]相同,说明图中存在奇环,不是二分图,标记ok = 0。38. 答案:C (
!ok || c[s] == c[t]) 解析:若图中存在奇环(!ok),则可以通过绕环改变路径奇偶性,总能调整到权值为 0。若图是二分图(ok),则任意两点间的所有路径长度奇偶性相同。若起点和终点同色(c[s] == c[t]),路径长度必为偶数,也可以通过调整达到权值 0。若异色,路径长度必为奇数,最小权值至少为 1。(2)标准答案
39. 答案:C (
m - 2 * x[i]) 解析:目标函数经过数学变换后,可以转化为关于学生状态 的线性组合。初始化时,c[i]存储的是与预期得分 相关的偏移量系数,推导可得其值为 。40. 答案:B (
mask ^ (mask >> 1)) 解析:这是生成格雷码 (Gray Code) 的标准公式,用于在状态空间中进行相邻状态(仅改变 1 位)的遍历,从而优化状态转移的计算量。41. 答案:D (
__builtin_ctzll(d)) 解析:d = g ^ lst表示当前状态与上一个状态不同的位。__builtin_ctzll(d)返回d的二进制表示中末尾连续 0 的个数,即发生状态翻转的学生索引 。42. 答案:A (
2ll * s[k] * c[k]) 解析:当学生 的状态 翻转时,目标函数中的相关项需要更新。由于是从 变为 (或反之),变化量为 ,乘以系数 即为对总和 的修正量。43. 答案:A (
v >= (n & 1)) 解析:在确定第 题的最终答案时,v代表了选择 'A' 时的某种得分优势。考虑到 的奇偶性对平局时的默认选择有影响,条件v >= (n & 1)能够完美处理奇偶边界情况( 为偶数时v >= 0, 为奇数时v >= 1),从而决定最终填入 'A' 还是 'B'。
- 1
信息
- ID
- 12686
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- (无)
- 递交数
- 44
- 已通过
- 3
- 上传者