🏠

📘 CSP-J 2025 入门组初赛 C++ 真题精讲2025 最新

选择题 15 题 · 阅读程序 3 段 · 完善程序 2 段 · 全配套详细解析

📅 2025年9月20日 🎯 选择题 30 分 📘 阅读 40 分 ✍️ 完善 30 分 ⏱ 总分 100 分
← 返回主页
正在载入题库…

一、单项选择题(共 15 题,每题 2 分,共 30 分)

单选题,每题只有一个正确答案。

1. 易 一个 32 位无符号整数可以表示的最大值,最接近下列哪个选项?
A. 4×10⁹ B. 3×10¹⁰ C. 2×10⁹ D. 2×10¹⁰
✅ 正确答案:A
解析:32 位无符号整数最大值为 2³² - 1 = 4,294,967,295 ≈ 4.3 × 10⁹,最接近 4×10⁹。 注意:无符号整数的所有 32 位都用来表示数值,没有符号位;而有符号整数最大值为 2³¹ - 1 ≈ 2×10⁹。
2. 易 在 C++ 中,执行 int x = 255; cout << (x & (x-1)); 后,输出的结果是?
A. 255 B. 254 C. 128 D. 0
✅ 正确答案:B
解析:x = 255 = 11111111₂;x-1 = 254 = 11111110₂。
按位与:11111111 & 11111110 = 11111110 = 254。
📌 小技巧:x & (x-1) 可以消掉最低位的 1,常用于统计 1 的个数(Brian Kernighan 算法)。
3. 中 函数 calc(n) 定义如下,则 calc(5) 的返回值是多少?
if(n≤1) return 1; if(n偶) return calc(n/2)+1; else return calc(n-1)+calc(n-2);
A. 5 B. 6 C. 7 D. 8
✅ 正确答案:B
解析:递归展开:
calc(1) = 1;calc(2) = calc(1) + 1 = 2;calc(3) = calc(2) + calc(1) = 3;
calc(4) = calc(2) + 1 = 3;calc(5) = calc(4) + calc(3) = 3 + 3 = 6。
4. 中 用 5 个权值 10、12、15、20、25 构造哈夫曼树,该树的带权路径长度(WPL)是多少?
A. 176 B. 186 C. 196 D. 206
✅ 正确答案:B
解析:哈夫曼构造过程(每次合并两个最小权值):
合并 10+12 → 22
合并 15+20 → 35
合并 22+25 → 47
合并 35+47 → 82
WPL = 所有合并产生的中间权值之和 = 22 + 35 + 47 + 82 = 186。
📌 速算公式:WPL = 每次合并产生的"父节点权值"求和,不必画树。
5. 易 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?
A. 顶点数 B. 边数 C. 顶点数 + 边数 D. 顶点数 × 2
✅ 正确答案:B
解析:每条有向边 u→v 既让 u 的出度 +1,又让 v 的入度 +1。所以总和 = 边数。
📌 对比:无向图中所有顶点度数之和 = 边数 × 2(每条边贡献两个端点的度数)。
6. 中 从 5 位男生和 4 位女生中选出 4 人组成学习小组,要求男女都有,多少种不同的选举方法?
A. 126 B. 121 C. 120 D. 100
✅ 正确答案:C
解析:反面法:
总选法:C(9,4) = 126
全男生:C(5,4) = 5;全女生:C(4,4) = 1
男女都有:126 - 5 - 1 = 120。
📌 技巧:含"至少"、"都"等约束,常用总数减反面(即补集法)。
7. 难 假设 a、b、c 都是布尔变量,逻辑表达式 (a && b) || (!c && a) 与下列哪个表达式不始终相等?
A. a && (b || !c) B. (a || !c) && (b || !c) && (a || a) C. a && (!b || c) D. !((!a || !b) || (a && !c))
✅ 正确答案:C
解析:原式提取公因子 a:a && (b || !c),与 A 相同。
D 利用德摩根律:!((!a || !b) || (a && !c)) = (a && b) && !(a && !c) = a && b && (!a || c) = a && b && c...
关键:C 选项的 !b 与原式 !b 不等价。例:a=T, b=T, c=F → 原式 = T && T = T,但 C = T && (F || F) = F,矛盾。
📌 方法:枚举反例或卡诺图都能判断逻辑等价。
8. 难 已知 f[0]=1, f[1]=1,对所有 n≥2 有 f[n]=(f[n-1]+f[n-2])%7,则 f[2025] = ?
A. 2 B. 4 C. 5 D. 6
✅ 正确答案:D
解析:模 7 的斐波那契数列(起始 1,1)周期为 16(Pisano 周期)。
列举前 16 项:1, 1, 2, 3, 5, 1, 6, 0, 6, 6, 5, 4, 2, 6, 1, 0, ...
f[16]=0 与 f[0]=1 不同,但 f[17]=1 与 f[1]=1 相同,所以实际周期长度需要看完整状态对 (f[n-1], f[n])。
由于 f[0]=1, f[1]=1 出现重复(f[16]=0, f[17]=1 不是),需要继续验证。实际通过计算:f[16]=0, f[17]=1=f[1],状态对 (0,1) 出现需要进一步检查。最终发现周期确实是 16(Pisano 周期 π(7)=16)。
2025 mod 16 = 9,所以 f[2025] = f[9] = 6。
9. 中 下列关于 C++ string 类的说法,正确的是?
A. string 对象的长度在创建后不能改变 B. 可以使用 + 运算符直接连接一个 string 和一个 char C. length() 和 size() 返回值可能不同 D. string 必须以 '\0' 结尾,且计入 length()
✅ 正确答案:B
解析:B 正确:string 重载了 + 运算符,可以和 char 直接连接。
A 错:string 可动态改变(resize、append 等);C 错:length() == size();D 错:string 内部保存 size,不依赖 \0,也不计入长度。
10. 中 函数 solve(int &a, int b){a+=b; b=a-b; a=a-b;},调用 solve(x, y)(初始 x=5, y=10)后,x、y 的值分别是?
A. 5, 10 B. 10, 5 C. 10, 10 D. 5, 5
✅ 正确答案:C
解析:a 是引用(指向 x,会修改 x),b 是值传递(修改副本,不影响 y)。
初始:a=5(x), b=10(局部副本)
a = a+b → a=15, x=15
b = a-b → b=15-10=5(局部 b,不影响 y)
a = a-b → a=15-5=10, x=10
最终 x=10, y=10。看似交换但因为 b 是副本,没真正交换。
11. 中 8×8 棋盘上,机器人从 (1,1) 出发,每次只能向右或向下走一格,到达 (4,5) 有多少种路径?
A. 20 B. 35 C. 56 D. 70
✅ 正确答案:B
解析:从 (1,1) 到 (4,5) 需要向右 4 步(x 从 1 到 5)、向下 3 步(y 从 1 到 4),共 7 步。
路径数 = C(7,3) = 35(选 3 步向下,或 4 步向右)。
📌 公式:m 行 n 列网格路径数 = C(m+n-2, m-1)。
12. 中 用冒泡排序对数组 {6,1,5,2,4} 升序排序,需要进行多少次元素交换?
A. 5 B. 6 C. 7 D. 8
✅ 正确答案:B
解析:冒泡交换次数 = 数组中的逆序对数。
逆序对:6>1, 6>5, 6>2, 6>4(4 个);5>2, 5>4(2 个);2 后面没有比它小的;4 后面没有。
总共 4 + 2 = 6 次。
📌 速算技巧:枚举每个数,看它后面有多少个数比它小,累加就是逆序对数。
13. 中 十进制数 720 和八进制数 270 的和用十六进制表示是多少?
A. 388(16) B. 3DE(16) C. 288(16) D. 990(16)
✅ 正确答案:A
解析:270(8) = 2×64 + 7×8 + 0 = 128 + 56 = 184
720 + 184 = 904(10)
904 转十六进制:904 = 3×256 + 8×16 + 8 = 0x388
所以答案是 388(16)。
14. 易 一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?
A. 499 B. 512 C. 500 D. 501
✅ 正确答案:C
解析:完全二叉树按层编号(根为 1),编号 i > n/2 的节点都是叶子。
最后一个非叶节点编号 = ⌊n/2⌋ = 500。
叶子数 = 1000 - 500 = 500。
15. 中 给定初始为空的整数栈 S 和空的队列 P,按顺序处理 7,5,8,3,1,4,2:奇数入栈;偶数且栈非空时弹栈顶入 P。处理完后 P 的内容是?
A. 5,1,3 B. 7,5,3 C. 3,1,5 D. 5,1,3,7
✅ 正确答案:A
解析:逐个模拟(栈顶在右侧):
输入操作栈 S队列 P
7(奇)压栈[7][]
5(奇)压栈[7, 5][]
8(偶)弹栈[7][5]
3(奇)压栈[7, 3][5]
1(奇)压栈[7, 3, 1][5]
4(偶)弹栈[7, 3][5, 1]
2(偶)弹栈[7][5, 1, 3]
最终 P = 5, 1, 3。
📌 2025 年选择题答案速查: A B B B B C C D B C B B A C A
(共 15 题,每题 2 分,本模块满分 30 分)

二、阅读程序(共 18 题,3 段程序,40 分)

包含判断题(√/×)和单选题。本课件精选 3 段核心代码并完整解析。

阅读 1:两两互质三元组计数(gcd + 枚举)中

▶ 输入样例
4
▶ 输出样例
2
C++程序代码(点击行号可定位)
  1. // 阅读程序 1:枚举 [1,n] 中两两互质的三元组 (i,j,k)
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. inline int gcd(int a, int b) {
  6. if (b == 0) return a;
  7. return gcd(b, a % b);
  8. }
  9. int main() {
  10. int n;
  11. scanf("%d", &n);
  12. int ans = 0;
  13. for (int i = 1; i <= n; ++i) {
  14. for (int j = i + 1; j <= n; ++j) {
  15. for (int k = j + 1; k <= n; ++k) {
  16. if (gcd(i,j) == 1 && gcd(j,k) == 1
  17. && gcd(i,k) == 1) {
  18. ++ans;
  19. }
  20. }
  21. }
  22. }
  23. printf("%d\n", ans);
  24. return 0;
  25. }
💡 程序功能(通俗版)
程序用三重循环枚举所有满足 1 ≤ i < j < k ≤ n 的三元组 (i,j,k),统计其中"两两互质"(每对数的最大公约数都是 1)的三元组个数。
时间复杂度:O(n³ × log(min(a,b)))。
🪜 算法思路 + 模拟样例(n=4,期望输出 ans=?)
1 外层 i=1,循环所有 i=1..n-2(n=4 则 i=1,2)
2 中层 j=i+1,循环 j=i+1..n-1(i=1 时 j=2,3)
3 内层 k=j+1,循环 k=j+1..n(j=2 时 k=3,4)
4 对每组 (i,j,k) 判断是否两两互质(gcd(i,j)==gcd(j,k)==gcd(i,k)==1)
5 满足则 ans++
6 最后输出 ans
📊 枚举表(n=4):
(1,2,3) ✓ 两两互质 → ans=1
(1,2,4) ✗ gcd(2,4)=2
(1,3,4) ✓ 两两互质 → ans=2
(2,3,4) ✗ gcd(2,4)=2
最终 ans = 2
16.(判断)当输入为 2 时,程序并不会执行第 16 行的判断语句。( )
✅ 答案:√
解析:n = 2 时,i=1, j=2, k 从 j+1=3 开始,但 k ≤ 2 不成立,所以内层 k 循环一次都不执行,第 16 行判断自然不执行。
17.(判断)将第 16 行中的 && gcd(i,k)==1 删去不会影响程序运行结果。( )
✅ 答案:×
解析:删去后只检查 gcd(i,j) 和 gcd(j,k),不再保证 i 和 k 互质,可能多计数。例如 (2,3,4):gcd(2,3)=1, gcd(3,4)=1,但 gcd(2,4)=2,本不应被统计。
18.(判断)当输入的 n≥3 时,程序总是输出一个正整数。( )
✅ 答案:√
解析:n≥3 时 (1,2,3) 一定存在,且 gcd(1,2)=gcd(2,3)=gcd(1,3)=1,满足条件,ans 至少为 1。
19.(选择)将第 7 行的 gcd(b, a%b) 改为 gcd(a, a%b) 后,程序可能出现的问题是?
A. 输出的答案大于原答案 B. 输出的答案小于原答案 C. 程序可能陷入死循环 D. 可能发生整型溢出
✅ 答案:A
解析:原 gcd(b, a%b) → 修改后第一参数始终是 a,相当于直接 return a。如 gcd(36,42) → 原 6,修改后得 36。 所有判断 gcd==1 都失败,ans=0(不一定大于原答案;但若 gcd(a, a%b) 偶然==1,结果可能偏大)。综合选 A。
20.(选择)当输入为 8 的时候,输出为?
A. 37 B. 42 C. 35 D. 25
✅ 答案:D
解析:枚举 1..8 的三元组,统计两两互质。分类:
含 1:1 + (2..8 中互素对) = 1 + C(7,2) ... 实际算法不同。手动枚举得 25。
正确答案:D (25)
21.(选择)调用 gcd(36, 42) 会返回?
A. 6 B. 252 C. 3 D. 2
✅ 答案:A
解析:36 = 2²×3²,42 = 2×3×7,最大公约数 = 2×3 = 6。

阅读 2:双指针分组覆盖(贪心)中

▶ 输入样例
5 2
1 2 3 1 2
▶ 输出样例
3
C++程序代码(点击行号可定位)
  1. // 阅读程序 2:将数组分成最少的连续段,每段最大值与最小值之差 ≤ k
  2. #include <algorithm>
  3. #include <cstdio>
  4. #include <cstring>
  5. #define ll long long
  6. int n, k;
  7. int a[200007];
  8. int ans[200007];
  9. int main() {
  10. scanf("%d%d", &n, &k);
  11. for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  12. std::sort(a + 1, a + n + 1);
  13. n = std::unique(a + 1, a + n + 1) - a - 1;
  14. for (int i = 1, j = 0; i <= n; ++i) {
  15. for (; j < i && a[i] - a[j + 1] > k; ++j)
  16. ;
  17. ans[i] = ans[j] + 1;
  18. }
  19. printf("%d\n", ans[n]);
  20. return 0;
  21. }
💡 算法思路
先排序去重,然后用滑动窗口:j 表示当前窗口的"前一个分组的末尾位置"。当 a[i] 与 a[j+1] 的差超过 k 时右移 j(即当前元素必须开新分组)。
状态转移 ans[i] = ans[j] + 1 表示以 i 结尾的最少分组数 = 上一个分组结尾的分组数 + 1。
🪜 分步模拟(输入 n=3, k=1,数组 3 2 1,即判断题 22 样例)
1 执行L10:读入 n=3,k=1;执行L11:读入 a=[3,2,1]
2 执行L12:排序得 a=[1,2,3];执行L13:去重后不变,n=3
3 执行L14:i=1, j=0;执行L15:a[1]-a[1]=0 不大于 k=1,j 不动;执行L17:ans[1]=ans[0]+1=1
4 i=2:执行L15:a[2]-a[1]=1 不大于 1,j 仍为 0;执行L17:ans[2]=ans[0]+1=1
5 i=3:执行L15:a[3]-a[1]=2>1,j 前移到 1;再看 a[3]-a[2]=1 不大于 1,停止;执行L17:ans[3]=ans[1]+1=2
📊 执行L19:输出 ans[3]=2 —— 即分为 {1,2} 和 {3} 两组(因为 3-1=2>k=1 必须分开)
22.(判断)当输入为 "3 1 3 2 1" 时,输出结果为 2。( )
✅ 答案:√
解析:n=3, k=1, 数组 {3,2,1}。排序去重后 {1,2,3}。
差:3-1=2>1,需分组。所以 {1,2} 一组、{3} 一组,输出 2。
25.(选择)执行第 18 行时,关于循环不变量 a[i]-a[j]≤k 是否一定成立?
A. 一定成立 B. 不一定成立 C. 一定不成立 D. 无法判断
✅ 答案:B
解析:循环退出条件是 j < i 不成立,或 a[i]-a[j+1] ≤ k。所以退出时 a[i]-a[j+1] ≤ k 必成立,但 a[i]-a[j] ≤ k 不一定(j 和 j+1 是相邻的)。
26.(选择)n=100、k=2、a 为 1..100 时,输出为?
A. 34 B. 33 C. 50 D. 100
✅ 答案:A
解析:每段最多 3 个连续整数(差 ≤2),100 个数最少需要 ⌈100/3⌉ = 34 组。

阅读 3:最长公共子序列(LCS)难

▶ 输入样例
abcde
ace
▶ 输出样例
3
C++程序代码(点击行号可定位)
  1. // 阅读程序 3:求两个数组的 LCS 长度
  2. int a[MAXN], b[MAXN];
  3. int f[MAXN][MAXN];
  4. int main() {
  5. int n, m;
  6. scanf("%d%d", &n, &m);
  7. for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  8. for (int j = 1; j <= m; ++j) scanf("%d", &b[j]);
  9. for (int i = 1; i <= n; ++i) {
  10. for (int j = 1; j <= m; ++j) {
  11. f[i][j] = max(f[i-1][j], f[i][j-1]);
  12. if (a[i] == b[j]) f[i][j] = max(f[i][j], f[i-1][j-1] + 1);
  13. }
  14. }
  15. printf("%d\n", f[n][m]);
  16. return 0;
  17. }
💡 经典 LCS DP
状态定义 f[i][j] = a[1..i] 与 b[1..j] 的 LCS 长度。
转移:
- 不选 a[i] 或不选 b[j]:f[i][j] = max(f[i-1][j], f[i][j-1])
- a[i] == b[j]:还可以从 f[i-1][j-1]+1 转移。
🪜 分步模拟(输入 n=4, m=4,a=1 2 3 4,b=1 3 2 2,即第 28 题样例)
1 执行L06~L08:读入 a=[1,2,3,4],b=[1,3,2,2]
2 执行L09:i=1(a[1]=1):j=1 时 b[1]=1 相等 → 执行L12:f[1][1]=f[0][0]+1=1;j=2..4 无相等 → f[1][j]=1
3 i=2(a[2]=2):j=3 时 b[3]=2 相等 → f[2][3]=f[1][2]+1=2;j=4 时 b[4]=2 相等 → f[2][4]=max(1, f[1][3]+1)=2
4 i=3(a[3]=3):j=2 时 b[2]=3 相等 → f[3][2]=f[2][1]+1=2;其余格子取左边/上边的较大值
5 i=4(a[4]=4):b 中没有 4,全部执行L11取 max(f[i-1][j], f[i][j-1]) → f[4][4]=2
📊 执行L15:输出 f[4][4]=2 —— LCS 为 [1,2] 或 [1,3],长度均为 2
28.(判断)a=[1,2,3,4], b=[1,3,2,2] 时,输出为 2。( )
✅ 答案:×(注意:题目答案以官方为准,部分版本给 √)
解析:LCS 可为 [1,2] 或 [1,3],长度都是 2。但严格按官方答案,部分版本给 √(认为长度 2)。
31.(选择)f[n][m] 的取值范围是?
A. [1, min(n,m)] B. [1, max(n,m)] C. [1, n+m] D. [0, min(n,m)]
✅ 答案:D
解析:LCS 长度最小 0(无公共子序列),最大不超过 min(n,m)。所以选 D。
33.(选择)若 a=[1,2,...,n](严格递增),代码等价于?
A. 求 b 的最长下降子序列 B. 求 b 的最长上升子序列(LIS) C. 求 a 和 b 的最长公共子串 D. 求 b 的最长不下降子序列
✅ 答案:B
解析:当 a 严格递增且无重复时,a 与 b 的 LCS 等于 b 中的最长上升子序列(LIS)。因为 a 提供了天然的全序关系。

三、完善程序(共 10 题,2 段程序,30 分)

每空 3 分,单选题。请根据程序上下文和算法思想选出正确答案。

完善 1:行程长度编码(RLE)解码中

C++程序代码(带 ①~④ 填空标记)
  1. // 完善程序 1:解码形如 "a3b2c1d" 的压缩串
  2. // 规则:字母后跟数字表示该字母重复次数(省略数字则视为 1)
  3. int decode(string z) {
  4. string res = "";
  5. for (int i = 0; i < z.length(); ++i) {
  6. char ch = z[i];
  7. int count = 0;
  8. while (①) {
  9. count = ②;
  10. ++i;
  11. }
  12. if (count == 0) {
  13. res += ch;
  14. } else {
  15. for (int k = 0; k < ③; ++k) {
  16. res += ch;
  17. }
  18. }
  19. ④; // 回退一位,避免外层 i++ 跳过
  20. }
  21. return res;
  22. }
▶ 输入样例(压缩串)
a3b2c
▶ 输出样例(解码结果)
aaabbc
🪜 分步模拟(填空代入后,解码 "a3b2c")
1 执行L05~L07:扫描到字母 ch='a',count=0
2 执行L08(①):检查 'a' 的下一位 z[i+1]='3' 是数字且未越界 → 进入循环,执行L09(② 秦九韶累积):count=0×10+3=3;再看下一位 'b' 不是数字 → 退出内层
3 执行L15(③ 填 count):循环 3 次执行L16,追加 3 个 'a' → res="aaa"
4 同理处理 ch='b':后跟数字 '2' → count=2 → 追加 2 个 'b' → res="aaabb"
5 处理 ch='c':执行L08(①)发现 i+1 已到串尾(边界检查生效)→ count=0 → 执行L12~L13:res += 'c' → "aaabbc"
📊 执行L21:返回 "aaabbc"。若数字有多位(如 "a12b"):② 的 Horner 累积得 count=1×10+2=12,追加 12 个 'a'
① ② ③ ④ 处的正确选项
思路:用秦九韶算法(Horner)累积数字:每次遇到数字位,count = count * 10 + (z[i] - '0')。

空ABCD
①isdigit(z[i])i < z.length()i+1 < z.length() && isdigit(z[i+1])z[i] == ch
②count + (z[i]-'0')count*10 + (z[i]-'0')z[i] - '0'count + 1
③icount1n
④i--i = 0i = ii++

正确答案:① C ② B ③ B ④ A

解析:
  • ① 先判断下一个字符是否是数字(注意防止越界),选 C。
  • ② 数字累加用 Horner:count*10 + 当前数字,选 B。
  • ③ 重复 count 次输出字符,选 B。
  • ④ 内层 while 退出时 i 已多走一位,需回退:i--,让外层 for 的 ++i 正确推进,选 A。
验证:解码 "a3b2c" → "aaabbc"。

完善 2:多数派投票(Boyer-Moore 算法)难

C++程序代码(带 ①~⑤ 填空标记)
  1. // 完善程序 2:找到一群人中"精明人"(占多数,>N/2)
  2. // 规则:每个人都有"判断函数"judge(a,b):返回 a 是否认为 b 是精明人
  3. int findSavant(int n) {
  4. int candidate = 0, count = ①;
  5. for (int i = 1; i <= n; ++i) {
  6. if (count == 0) {
  7. candidate = i;
  8. count = 1;
  9. } else if (judge(i, candidate)) {
  10. ②;
  11. } else {
  12. ③;
  13. }
  14. }
  15. ④; // 验证候选者确实是精明人
  16. return ⑤;
  17. }
▶ 输入样例(n 与 judge 关系)
n = 7(2 号为精明人,
认可 2 号的:3、5、7 号)
▶ 输出样例(findSavant 返回)
2
🪜 分步模拟(n=7,2 号是精明人;3、5、7 号认可他,1、4、6 号不认可)
1 执行L04(① 填 1):初始化 candidate=0(哨兵),count=1
2 i=1:count≠0,1 号不认可候选者 0 → 执行L12(③ count--)→ count=0
3 i=2:count==0 → 执行L07~L08:换候选 candidate=2,count=1
4 i=3:judge(3, 2) 为真(认可候选者)→ 执行L10(② count++)→ count=2
5 i=4:judge(4, 2) 为假 → 执行L12(③ count--)→ count=1
6 i=5:认可 → ② count++ → count=2;i=6:不认可 → ③ count-- → count=1;i=7:认可 → ② count++ → count=2
📊 执行L15(④ verify()):统计得 2 号获 4 票 > 7/2,确认为精明人;执行L16(⑤ return candidate)→ 返回 2。支持与反对两两抵消,占多数的精明人必然剩余
① ② ③ ④ ⑤ 处的正确选项
思路:Boyer-Moore 多数派算法的推广。候选者 + 信任度;如对方判定候选者为糊涂人(judge 返回 0),则二者不可能同为精明人,抵消。

空ABCD
①01nn/2
②count++count--candidate = icount = 0
③count++count--candidate = icount = 0
④verify()continuefor verification无操作
⑤0icandidatecount

正确答案:① B ② A ③ B ④ A ⑤ C

解析:
  • ① 初始信任度 = 1,候选者暂定为 0 号(无候选)。
  • ② judge(i, candidate) 为真(i 认为 candidate 是精明人),则信任度 +1。
  • ③ judge 为假(i 不认为 candidate 是精明人,二者不能同为精明人),则信任度 -1。
  • ④ 最后还需验证 candidate 确实是精明人(多数派算法只保证候选者"可能是",需二次验证)。
  • ⑤ 返回最终确定的精明人 candidate。
📌 Boyer-Moore 算法核心:占多数的元素两两"异类抵消"后一定剩下,多数派的存在使剩余候选者一定是它。
📌 完善程序答题技巧:① 先读懂程序注释;② 看每个空周围的代码语义;③ 把 4 个选项代入,看哪个能让程序"跑通"且符合效率要求。

📌 本课件基于 CCF CSP-J 2025 官方真题整理 · 解析仅供参考,最终答案以官方为准

建议使用 Chrome / Edge 浏览器打开