判断题:枚举(穷举)= 把问题的所有可能答案逐一列举并逐个判断是否符合要求。
考点:枚举定义(A1)。
解析:枚举(穷举)= 把所有可能的答案逐一列出,逐个判断是否符合要求——最朴素、最万能的方法。✅ 正确
排除法:无(判断题)。混淆点:枚举是"暴力"但不是"乱试"——要有明确的范围和判断条件(A2)。
关联 · 枚举三要素(A2):范围、条件、答案更新——枚举的骨架。
判断题:枚举的三要素:枚举范围(有哪些可能)、判断条件(是否符合要求)、答案更新(计数/求最值/记录)。
考点:枚举三要素(A2)。
解析:枚举三要素:① 枚举范围(有哪些候选)② 判断条件(哪些符合)③ 答案更新(计数/最值/记录)。✅ 正确
排除法:无(判断题)。混淆点:三要素缺一不可——范围错则漏解、条件错则错解、更新错则答案错。
关联 · 枚举定义(A1):三要素是"穷举"的规范化。
判断题:枚举 中满足条件的数,用一层 for 循环即可。
考点:单重枚举(A3)。
解析:一个候选变量 → 一层 for——枚举 只需单重循环。✅ 正确
排除法:无(判断题)。混淆点:循环层数 = 枚举的"自由度"个数(A4)。
关联 · 双重枚举(A4):一个变量一层——自由度决定层数。
判断题:枚举所有"数对"(如 的两两组合)需要两层循环。
考点:双重枚举(A4)。
解析:数对 是两个变量 → 两层循环; 时内层从 起。✅ 正确
排除法:无(判断题)。混淆点: 的数对共 个——内层起点 避免重复。
关联 · 数对枚举(B2):组合数 ——"两两配对"的标准写法。
判断题:枚举的时间复杂度 ≈ 枚举的规模(如枚举 是 、枚举所有数对是 )。
考点:枚举复杂度(A5)。
解析:枚举复杂度 ≈ 枚举规模:单重 、双重 、子集 ——规模决定可行性。✅ 正确
排除法:无(判断题)。混淆点:枚举前先算规模——超时就没法用(B7/E6)。
关联 · 时间估算(E6):/秒——规模与时间的换算。
判断题:能直接用公式算的问题(如等差数列求和)不必枚举——公式 、枚举 。
考点:枚举 vs 公式(A6)。
解析:有公式就用公式:等差数列和 是 、枚举是 ——数学优先。✅ 正确
排除法:无(判断题)。混淆点:公式求不出(复杂条件)才枚举——枚举是"兜底"手段。
关联 · 枚举范围估算(B7):先想公式、再想枚举。
判断题:"找出 中所有 7 的倍数"是典型的单重枚举题。
考点:枚举找数(B1)。
解析:"找出 1~100 中 7 的倍数":单层循环 + 整除判断——枚举找数的标准形态。✅ 正确
排除法:无(判断题)。混淆点:也可以直接 7, 14, ...(步长 7 枚举)——两种写法等价。
关联 · 单重枚举(A3):范围 + 条件——B 组每题都是它的实例。
判断题:枚举 个元素中所有两两组合(),共 对。
考点:数对枚举(B2)。
解析: 个元素两两组合()共 对。✅ 正确
排除法:无(判断题)。混淆点: 是把 与 都算(有序对)—— 是无序组合。
关联 · 双重枚举(A4):内层 起—— 的代码实现。
判断题: 个元素的子集共 个,可以用二进制()逐位表示选取情况。
考点:子集枚举(B3)。
解析: 元素 个子集;二进制枚举:mask 的每一位表示对应元素选/不选。✅ 正确
排除法:无(判断题)。混淆点: 增长极快( 已百万)——子集枚举只适合小 。
关联 · 子集枚举代码(K1):
mask & (1 << i)判第 i 位——位运算选子集。
判断题: 个元素的全排列共 种,C++ 可用 next_permutation 逐个生成。
考点:排列枚举(B4)。
解析: 元素全排列 种;next_permutation 按字典序逐个生成。✅ 正确
排除法:无(判断题)。混淆点: 增长比 还快—— 左右才可全排列。
关联 · next_permutation(K2):
do-while配合——第一组也要执行。
判断题:枚举 的所有因数只需试到 (每找到一个因数 , 也是因数)。
考点:因数枚举(B5)。
解析:枚举因数只需试到 :找到 时 也是因数(成对出现)。✅ 正确
排除法:无(判断题)。混淆点:完全平方数时 (如 36 的 6)——成对中的"自配对"只算一次(K4)。
关联 · 枚举因数代码(K4): 从 优化而来——边界缩小的经典。
判断题:"找出 中的所有回文数"是枚举 + 逐个数位判断。
考点:回文数枚举(B6)。
解析:枚举 + 逐个数位判断回文——枚举 + 判断函数的标准组合。✅ 正确
排除法:无(判断题)。混淆点:判断回文 = 反转数字与原数相等(K6)——"判断"独立成函数。
关联 · 枚举答案验证(E4):枚举候选、函数验证——分工清晰。
判断题:枚举前先估算规模——枚举量超过 量级通常会超时,要换思路。
考点:范围估算(B7)。
解析:枚举前估算规模:超 量级约 1 秒(E6)——超过就要换思路(公式/优化)。✅ 正确
排除法:无(判断题)。混淆点:规模估算决定"能不能暴力"——初赛估算题常考。
关联 · 时间估算(E6):/秒是估算标尺。
判断题:模拟 = 不找数学捷径,按题意一步步执行规则,跟踪状态变化。
考点:模拟定义(C1)。
解析:模拟 = 不找数学捷径,按题目规则一步步执行、跟踪状态——"题目说什么就做什么"。✅ 正确
排除法:无(判断题)。混淆点:模拟 ≠ 枚举(枚举找答案、模拟走过程)——但两者常组合(O5)。
关联 · 模拟步骤(C2):读入 → 初始化 → 循环 → 输出。
判断题:模拟题的通用流程:读入 → 初始化状态 → 循环按规则更新 → 输出结果。
考点:模拟步骤(C2)。
解析:模拟题标准流程:读入 → 初始化状态 → 循环按规则更新 → 输出结果。✅ 正确
排除法:无(判断题)。混淆点:初始化错误全盘皆输(H2)——每步都要与题意核对。
关联 · 状态转移(C3):循环 = 状态的连续更新。
判断题:模拟的核心是"状态"——每轮循环按规则把当前状态更新成下一个状态。
考点:状态转移(C3)。
解析:模拟的核心是"状态":每轮循环把当前状态按规则更新为下一状态。✅ 正确
排除法:无(判断题)。混淆点:状态 = 模拟中的所有变量(位置/计数/标记)——转移函数就是题目规则。
关联 · 模拟死循环(H4):状态必须推进——否则死循环。
判断题:模拟过程中常用计数器(轮数、次数、数量)记录过程信息。
考点:模拟计数(C4)。
解析:模拟过程常用计数器记录:轮数、次数、剩余数量——计数器也是状态的一部分。✅ 正确
排除法:无(判断题)。混淆点:多轮模拟每轮要重置计数(H3)——计数器的生命周期管理。
关联 · 模拟步骤(C2):计数器的初始化/更新/重置——跟着状态走。
判断题:报数/约瑟夫类问题用数组(或链表)记录"当前在场的人",逐步删除。
考点:数组模拟(C5)。
解析:报数/约瑟夫用数组(或链表)记"谁还在场",出列标记/删除——数据结构模拟实际对象。✅ 正确
排除法:无(判断题)。混淆点:链表版删除 、数组版标记 ——bool 数组是简版。
关联 · 约瑟夫(D1):数组/链表/队列三种模拟法——各有所长。
判断题:日期类模拟要处理"进位":秒满 60 进分、分满 60 进时、时满 24 进天。
考点:日期模拟(C6)。
解析:时间模拟的关键是进位:60 秒进 1 分、60 分进 1 时、24 时进 1 天。✅ 正确
排除法:无(判断题)。混淆点:日期还要考虑大小月、闰年(D3)——进位规则更复杂。
关联 · 时分秒换算(L4):
/取整、%取余——进位就是除法。
判断题:输出图形(星号塔、数字三角形)用两层循环:外层行、内层列。
考点:图形模拟(C7)。
解析:输出图形 = 两层循环:外层行、内层列——每行先算"这行输出什么"。✅ 正确
排除法:无(判断题)。混淆点:空格 + 星号的组合(星号塔)——列循环里分前导空格与星号两段(L5)。
关联 · 图形输出(D5):行列循环 + 数量公式 = 图形题三件套。
判断题:约瑟夫问题:n 人围圈,报到 k 出列——模拟到只剩一人。
考点:约瑟夫(D1)。
解析:约瑟夫:n 人围圈、报到 k 出列——模拟"报数 + 出列"直到剩一个。✅ 正确
排除法:无(判断题)。混淆点:出列的人不再报数——跳过已出列者(L1 的 continue)。
关联 · 约瑟夫模拟代码(L1):bool 数组标记 + 报数计数——数组版模板。
判断题:发牌模拟:按顺序把牌轮流发给 n 个人,可用"第 i 张发给第 i%n 人"。
考点:发牌模拟(D2)。
解析:第 张发给第 个人——取模实现轮流分配。✅ 正确
排除法:无(判断题)。混淆点:编号从 0 起(0~n-1)才用 i % n——从 1 起要 (i-1) % n + 1。
关联 · 取模循环(F1):取模 = 循环分配/循环数组的钥匙。
判断题:计算两个日期之间的天数,要逐月考虑大小月与闰年。
考点:日期计算(D3)。
解析:计算两日期天数:逐月加大小月天数、闰年 2 月 29 天——天数表 + 累加。✅ 正确
排除法:无(判断题)。混淆点:闰年判定:4 年一闰、百年不闰、四百年再闰。
关联 · 日期天数代码(L3):
days[13]表——月份天数直接查表。
判断题: 秒 = 小时 分 秒。
考点:时间换算(D4)。
解析:——小时/分/秒分别用 / 与 % 拆。✅ 正确
排除法:无(判断题)。混淆点:t % 3600 / 60 是"去小时后剩下的分钟"——先除后模的顺序。
关联 · 时分秒代码(L4):
/3600、%3600/60、%60——三级拆解。
输出 行星号塔:第 行有 个星号,且每行居中(星号前用空格补齐)。例如 时输出:
* *** *****
判断题:上述星号塔第 行有 个星号(居中)。
考点:图形输出(D5)。
解析:星号塔第 行 个星号、前导空格 个——每行的数量公式是核心。✅ 正确
排除法:无(判断题)。混淆点:星号数 1,3,5...(奇数递增)—— 公式。
关联 · 星号塔代码(L5):空格循环 + 星号循环——两段式列输出。
判断题:输出有规律的数字序列(如 1、22、333……),每行的数字 = 行号,重复行号次。
考点:字符串规律(D6)。
解析:有规律输出(1、22、333…):第 行输出数字 共 次——"行号 = 数字 = 次数"。✅ 正确
排除法:无(判断题)。混淆点:规律题先找"行号与输出的关系"——公式化后两层循环照写。
关联 · 数字三角形(L6): 递增输出——图形题的同族。
判断题:枚举中的剪枝 = 遇到不可能满足条件的值,提前跳过/终止,减少枚举量。
考点:剪枝(E1)。
解析:剪枝 = 提前排除不可能的分支:如枚举到已超界就 break——减少无意义枚举。✅ 正确
排除法:无(判断题)。混淆点:剪枝不改正确性(只跳过"必错"的分支)——安全优化。
关联 · 存在性提前结束(G5):
break/return也是剪枝的一种。
判断题:枚举边界可以数学缩小——如枚举 的 ,只需 而不是 。
考点:缩小边界(E2)。
解析:枚举边界用数学缩小: 的 只需 ——从"值域"算"可行域"。✅ 正确
排除法:无(判断题)。混淆点:边界缩小 = 从约束反推范围——枚举优化第一招。
关联 · 因数枚举(B5):试到 ——边界缩小的范例。
判断题:暴力枚举只适合数据规模小的题(如 单重、 双重)。
考点:暴力适用范围(E3)。
解析:暴力枚举适合小数据:单重 、双重 、子集 左右。✅ 正确
排除法:无(判断题)。混淆点:数据范围是"能不能暴力"的第一判断——读题先看范围。
关联 · 范围估算(B7):范围 → 规模 → 时间——三步判断。
判断题:"枚举可能的答案,逐个验证是否满足条件"——枚举与判断分离的通用模式。
考点:枚举答案验证(E4)。
解析:"枚举候选答案 + 验证函数判断"——枚举与判断分离,代码清晰、易改。✅ 正确
排除法:无(判断题)。混淆点:验证函数独立后,换条件只改函数——可维护性来源。
关联 · 回文数枚举(B6):判断函数化的实例。
判断题:打表 = 事先算好所有结果存起来,查询时 取——用空间换时间。
考点:打表(E5)。
解析:打表 = 预计算所有结果存数组,查询 ——空间换时间;适合"多次查询"的场景。✅ 正确
排除法:无(判断题)。混淆点:打表 ≠ 硬编码——是程序预计算(也可离线算好写死)。
关联 · 枚举复杂度(A5):枚举一次、查询多次——打表把 摊成 。
判断题:C++ 每秒约执行 次简单运算——枚举量接近 大约 1 秒。
考点:时间估算(E6)。
解析:C++ 约 次简单运算/秒——枚举量 约 1 秒; 可能超时。✅ 正确
排除法:无(判断题)。混淆点:估算是数量级判断(不是精确计时)——超 就要优化。
关联 · 范围估算(B7):规模 × 每步代价 ≈ 总时间。
判断题:约瑟夫"围圈"用取模实现循环:pos = (pos + 1) % n。
考点:取模循环(F1)。
解析:pos = (pos + 1) % n——下标越界绕回 0:取模实现"围圈"。✅ 正确
排除法:无(判断题)。混淆点:n 人编号 1~n 时用 pos % n + 1——编号起点决定公式。
关联 · 循环数组(F2):取模 = 循环——数组/队列/约瑟夫通用。
判断题:循环数组模拟 = 下标取模:a[i % n] 让数组首尾相接。
考点:循环数组(F2)。
解析:a[i % n] 让数组首尾相接——有限数组模拟无限循环序列。✅ 正确
排除法:无(判断题)。混淆点:下标从 0 起才 i % n——从 1 起要调整(D2 的提醒)。
关联 · 取模循环(F1):循环访问的统一实现。
判断题: 盏灯的开/关可以用一个 位二进制数表示(1 开 0 关)。
考点:二进制状态(F3)。
解析: 盏灯 = 位二进制(1 开 0 关):一个整数存全部状态——状态压缩。✅ 正确
排除法:无(判断题)。混淆点:翻转某位用异或 state ^= (1 << k)——位运算改状态。
关联 · 子集枚举(B3):二进制状态与子集枚举同源——mask 就是状态。
判断题:给一串操作指令(push/pop),用栈或队列按序执行并输出结果。
考点:栈队列模拟操作(F4)。
解析:给操作序列(push/pop),用栈/队列按序执行并输出——"指令驱动"模拟。✅ 正确
排除法:无(判断题)。混淆点:pop 前判空(第 8 章 H2)——操作序列可能触发下溢。
关联 · 栈操作模拟(M2):指令序列 + 数据结构 = 阅读程序高频。
判断题:指令序列模拟:读入操作序列(如 +3 -2 +5),按序更新一个变量。
考点:指令序列(F5)。
解析:读入操作序列(+3 -2 +5),按序更新变量——最简单的一维模拟。✅ 正确
排除法:无(判断题)。混淆点:变量 = 状态、指令 = 转移规则——C3 的最小实例。
关联 · 状态转移(C3):每条指令一次状态更新。
判断题:回合制游戏模拟:外层循环是回合数,每轮按规则更新双方状态。
考点:回合制(F6)。
解析:回合制模拟:外层循环 = 回合数,每轮按规则更新双方状态——"轮"是时间轴。✅ 正确
排除法:无(判断题)。混淆点:每轮开始的状态是上轮结束的状态——连续性由循环保证。
关联 · 多轮模拟(M6):翻倍/累加——每轮一次更新。
判断题:模拟题调试的常用手段:每轮循环打印中间状态,对照样例找偏差。
考点:模拟调试(F7)。
解析:模拟题调试 = 每轮打印中间状态,与手算样例对照——定位"第几轮开始错"。✅ 正确
排除法:无(判断题)。混淆点:模拟的错往往在中间轮——只看最终输出找不到。
关联 · 模拟步骤(C2):状态可打印——模拟的"可调试性"。
判断题:枚举顺序影响"答案取谁":升序枚举第一次找到的最小、降序枚举第一次找到的最大。
考点:枚举顺序(G1)。
解析:枚举顺序影响"先找到谁":升序先找最小、降序先找最大——按答案需求选顺序。✅ 正确
排除法:无(判断题)。混淆点:找"最小满足"升序 + break;找"最大满足"降序 + break(G2)。
关联 · 逆序枚举(G2):顺序 = 答案的"搜索方向"。
判断题:逆序枚举(从大到小)常用来求"最大的满足条件的数"。
考点:逆序枚举(G2)。
解析:从大到小枚举,第一个满足条件的就是最大的——"最大满足"用逆序。✅ 正确
排除法:无(判断题)。混淆点:升序枚举找最大要全扫完比较(G4)——逆序可直接 break。
关联 · 枚举顺序(G1):逆序 = 降序搜索——方向即答案。
判断题:"有多少个数满足条件"——枚举 + 计数器,每命中一次 cnt++。
考点:枚举计数(G3)。
解析:"有多少个满足":枚举 + cnt++——每命中一次加一。✅ 正确
排除法:无(判断题)。混淆点:计数器的初始 0 与放置位置(条件内)——漏放则白枚举。
关联 · 枚举计数代码(I3):
if (条件) cnt++;——枚举三要素的"更新"。
判断题:"最大的满足条件的数"——枚举时与当前最值比较更新。
考点:枚举最值(G4)。
解析:"最大的满足条件的数":枚举 + 与当前最值比较更新(或逆序早停)。✅ 正确
排除法:无(判断题)。混淆点:最值变量初值(最小值要负无穷/降序早停)——初值选错答案错。
关联 · 枚举最值代码(I5):
mx = max(mx, x)——一趟维护最值。
判断题:"是否存在满足条件的数"——枚举时一旦找到可提前结束(break/return)。
考点:枚举存在性(G5)。
解析:"是否存在满足的数":找到即可 break/return——提前结束省时间。✅ 正确
排除法:无(判断题)。混淆点:不存在时循环跑完——用 bool found 标记判断。
关联 · 剪枝(E1):早停 = 存在性剪枝——枚举优化的最小形态。
判断题:模拟/枚举输出要按题意处理空格与换行(如每行末尾不能多余空格)。
考点:输出格式(G6)。
解析:输出按题意处理空格/换行:行尾无多余空格(末尾换行)、行间空格——格式也是得分点。✅ 正确
排除法:无(判断题)。混淆点:严格 OJ 会判格式——i == n ? '\n' : ' ' 是三目处理法(P4)。
关联 · 输出格式代码(P4):三目运算符控制分隔——标准姿势。
判断题:枚举边界 < 与 <= 差一个数——"1 到 n"应写 i <= n。
考点:枚举边界(H1)。
解析:< 与 <= 差一个数:"1 到 n" 是 i <= n(含端点)——边界写错漏一个。✅ 正确
排除法:无(判断题)。混淆点:数组遍历是 i < n(下标 0~n-1)——两个场景两种边界(第 6 章 D7)。
关联 · 循环边界漏(P1):含端点
<=、不含<——数清个数再写。
判断题:模拟的初始状态设置错误,后面全盘皆错——初始化要与题意逐项核对。
考点:初始状态(H2)。
解析:模拟的初始状态错 → 后面全错——初始化必须逐项核对题意(初值/起点/标记)。✅ 正确
排除法:无(判断题)。混淆点:常见错:起点写错、初始计数不为 0、标记初始全 true——初始化是模拟的"地基"。
关联 · 模拟步骤(C2):初始化是第 2 步——出错概率最高的地方之一。
判断题:多轮模拟中,每轮开始要把计数/标记等变量重置,否则结果被上轮污染。
考点:循环变量重置(H3)。
解析:多组/多轮模拟,每组开始要重置计数与标记——否则被上一组污染。✅ 正确
排除法:无(判断题)。混淆点:重置语句放在"每组循环的开头"——位置比存在更重要。
关联 · 循环变量不重置(P2):cnt 跨组累加——多组数据的头号 bug。
判断题:模拟循环若状态一直不变(条件永远为真),会死循环——循环必须保证状态推进。
考点:模拟死循环(H4)。
解析:循环条件永远为真(状态不推进)→ 死循环——每轮必须改变判断条件相关的状态。✅ 正确
排除法:无(判断题)。混淆点:忘 i++、条件变量不更新——while 循环的经典死法(P3)。
关联 · 死循环(P3):循环三件套:初始化、条件、更新——缺更新即死。
下列说法错误的是( )。
考点:综合判断(H5)。
解析:D 错误——枚举所有数对是双重循环 ( 个数对),不是 。✅ D
排除法:A 枚举规模决定复杂度 ✓;B 模拟按规则更新状态 ✓;C 单重循环 ✓。
关联 · 本章串联:A(A5)、B(C3)、C(A3)、D(A4)——综合题 = 细节判断的集合。
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 cout << i << ' '; // 依次输出 1 ~ n
判断题:输入 时输出 1 2 3 4 5。
考点:1~n 循环枚举(I1)。
实现要点:枚举的骨架 = for (i = 1; i <= n; i++)——"起点、终点(含)、步长"三件套;<= 表示含 n。
解析:n=5 输出 1 2 3 4 5。✅ 正确
排除法:无(判断题)。混淆点:i < n 会漏 n(H1)——含端点是枚举惯例。
关联 · 单重枚举(A3):循环即枚举——三要素落成三行代码。
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 if (i % 3 == 0 && i % 5 == 0) 05 cout << i << ' '; // 同时被 3 和 5 整除
判断题:输入 时输出 15(20 以内只有 15 同时被 3、5 整除)。
考点:枚举找数(I2)。
实现要点:枚举 + 条件:循环内 if (i % 3 == 0 && i % 5 == 0)——"同时被 3、5 整除"翻译成 && 条件。
解析:1~20 中只有 15 同时被 3、5 整除。✅ 正确
排除法:无(判断题)。混淆点:||(或)会多输出 3、5、6、9、10、12、18、20——同时满足用 &&。
关联 · 枚举找数(B1):范围 + 条件——标准形态。
验算:15 是唯一解 ✓
01int n, cnt = 0; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 if (i % 7 == 0) cnt++; // 7 的倍数计数 05cout << cnt;
判断题:输入 时输出 (7, 14, 21, 28 共 4 个)。
考点:枚举计数(I3)。
实现要点:计数 = 枚举 + 条件内 cnt++:初始 0、命中加一——三要素的"答案更新"。
解析:1~30 中 7 的倍数:7, 14, 21, 28 共 4 个。✅ 正确
排除法:无(判断题)。混淆点:cnt++ 放 if 内(只数命中)——放外面数的是总数。
关联 · 枚举计数(G3):条件内计数——计数器的位置决定语义。
验算:30 ÷ 7 = 4 余 2 ✓
01int n, sum = 0; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 if (i % 2 == 0) sum += i; // 偶数求和 05cout << sum;
判断题:输入 时输出 (2+4+6+8+10)。
考点:枚举求和(I4)。
实现要点:求和 = 枚举 + 条件内累加:sum += i——与计数同模板,把 ++ 换成 += i。
解析:2+4+6+8+10 = 30。✅ 正确
排除法:无(判断题)。混淆点:初值 0(累加身份)、步长 2 也能做(i += 2)——两种写法。
关联 · 枚举求和(A5 对照):公式 与枚举殊途同归——枚举是通用版。
验算: ✓
01int n, x, mx = -1e9; 02cin >> n; 03for (int i = 1; i <= n; i++) { 04 cin >> x; 05 if (x > mx) mx = x; // 找最大值 06} 07cout << mx;
判断题:输入 5 3 9 1 7 5 时输出 。
考点:枚举最值(I5)。
实现要点:找最大值 = 初值极小(-1e9)+ 逐个比较更新——mx 的初值必须小于所有可能值。
解析:3,9,1,7,5 最大 9。✅ 正确
排除法:无(判断题)。混淆点:初值 0 在负数数据下会错——负无穷/第一个元素两种安全初值。
关联 · 枚举最值(G4):比较更新——一趟 。
验算:max = 9 ✓
01int n; 02cin >> n; 03for (int i = n; i >= 1; i--) 04 cout << i << ' '; // 从 n 到 1
判断题:输入 时输出 4 3 2 1。
考点:逆序枚举(I6)。
实现要点:逆序 = 起点 n、终点 1、步长 -1:for (i = n; i >= 1; i--)——方向反转的循环。
解析:n=4 输出 4 3 2 1。✅ 正确
排除法:无(判断题)。混淆点:i-- 是步长 -1——条件 i >= 1 含终点。
关联 · 逆序枚举(G2):找"最大的满足"用逆序早停。
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 for (int j = i + 1; j <= n; j++) 05 cout << i << ',' << j << ' ';
判断题:输入 时输出 1,2 1,3 2,3(所有 的数对)。
考点:数对枚举(J1)。
实现要点:数对 双层循环:外层 i、内层 j 从 i+1 起——起点错位避免重复与自配。
解析:n=3 → (1,2)(1,3)(2,3) = 1,2 1,3 2,3。✅ 正确
排除法:无(判断题)。混淆点:内层从 1 起会把 (i,j) 与 (j,i) 都输出—— 是组合的关键。
关联 · 数对枚举(B2): 的代码实现。
验算:3 组 ✓
01// 枚举 1~n 中所有两两组合(i < j),输出组合个数 02int n, cnt = 0; 03cin >> n; 04for (int i = 1; i <= n; i++) 05 for (int j = i + 1; j <= n; j++) 06 cnt++; 07cout << cnt;
判断题:输入 时输出 ()。
考点:组合输出(J2)。
实现要点:组合计数 = 双层循环计数——;内层 j = i+1 保证不重不漏。
解析:n=4 → 。✅ 正确
排除法:无(判断题)。混淆点: 是漏了"除以 2"(有序对)—— 才是组合。
关联 · 数对枚举(B2):计数 = 组合数公式验证循环写法。
验算: ✓
01// 枚举 1~10 中两个数,判断 i*j == 12 的数对 02for (int i = 1; i <= 10; i++) 03 for (int j = i + 1; j <= 10; j++) 04 if (i * j == 12) cout << i << ' ' << j << endl;
判断题:输出 2 6 和 3 4 两行。
考点:二元组判断(J3)。
实现要点:双层枚举 + 条件:每对数对判断 i * j == 12——枚举所有可能、条件筛出答案。
解析: 中积为 12:(2,6)、(3,4)。✅ 正确
排除法:无(判断题)。混淆点:(1,12) 的 12 超范围、(4,3) 违反 i<j——范围与顺序双重约束。
关联 · 双重枚举(A4):枚举 + 判断——通用模式。
验算:2×6=12、3×4=12 ✓
01// 枚举三边 a < b < c(都在 1~5 内),判断能否构成三角形 02// 条件:a + b > c 03int cnt = 0; 04for (int a = 1; a <= 5; a++) 05 for (int b = a + 1; b <= 5; b++) 06 for (int c = b + 1; c <= 5; c++) 07 if (a + b > c) cnt++; 08cout << cnt;
判断题:输出 ((2,3,4)、(2,4,5)、(3,4,5) 三组)。
考点:三角形枚举(J4)。
实现要点:三边三重循环(a<b<c 避免重复)+ 三角形条件 a+b>c(排序后只需判最大边)——枚举的"维度"加一层。
解析:1~5 中三角形:(2,3,4)、(2,4,5)、(3,4,5) 共 3 组。✅ 正确
排除法:无(判断题)。混淆点:(2,3,5) 的 2+3=5 不 >5(退化不成三角形)——严格大于。
关联 · 组合枚举(K3):三重循环 = 三维组合。
验算:a+b>c 过滤后 3 组 ✓
01// 枚举 2020 年 1 月到 12 月,统计有 31 天的月份数(大月 1/3/5/7/8/10/12) 02int cnt = 0; 03for (int m = 1; m <= 12; m++) 04 if (m == 1 || m == 3 || m == 5 || m == 7 || m == 8 || m == 10 || m == 12) cnt++; 05cout << cnt;
判断题:上述代码输出 。
考点:年月枚举(J5)。
实现要点:枚举月份 + 大月判断(1/3/5/7/8/10/12)——"口诀 7 个月"数清楚;用数组 days[13] 更优雅。
解析:大月 7 个。✅ 正确
排除法:无(判断题)。混淆点:2 月特殊(28/29)、小月 30 天——月份天数三档。
关联 · 日期模拟(C6):月份表是日期题的基石。
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) { 04 for (int j = 1; j <= i; j++) 05 cout << i * j << ' '; 06 cout << endl; 07}
输入 时输出:
1 2 4 3 6 9
判断题:第三行输出 3 6 9。
考点:乘法表(J6)。
实现要点:乘法表 = 双层循环,内层上界 = 外层变量(j <= i)——三角形输出;i * j 是输出值。
解析:n=3 第三行:3×1、3×2、3×3 = 3 6 9。✅ 正确
排除法:无(判断题)。混淆点:内层 j <= n 输出的是矩形表——j <= i 才是三角形。
关联 · 数字三角形(L6):同族——内层上界随外层变化是"三角形"的标志。
01int n, cnt = 0; 02cin >> n; 03for (int i = 1; i <= n; i++) 04 for (int j = 1; j <= n; j++) 05 cnt++; 06cout << cnt;
判断题:输入 时输出 ( 次计数,)。
考点:双重复杂度(J7)。
实现要点:双层循环执行 次——复杂度 ;计数输出 验证。
解析:n=100 → 10000。✅ 正确
排除法:无(判断题)。混淆点:cnt 每层循环体都加一次——总次数 = 两层层数乘积。
关联 · 枚举复杂度(A5): 的直观验证。
验算: ✓
01// 枚举 {1,2,3} 的所有子集:mask 从 0 到 7(2^3 - 1) 02// 第 i 位为 1 表示选中 i+1 03for (int mask = 0; mask < (1 << 3); mask++) { 04 for (int i = 0; i < 3; i++) 05 if (mask & (1 << i)) cout << i + 1 << ' '; 06 cout << endl; 07}
判断题:共输出 行(含空行 = 空集)。
考点:子集枚举(K1)。
实现要点:子集枚举 = mask 从 0 到 + 位判断 mask & (1 << i)——每位一个元素,1 选 0 不选;mask=0 是空集(输出空行)。
解析:{1,2,3} 有 个子集(含空集)。✅ 正确
排除法:无(判断题)。混淆点:1 << 3 是 8——mask 到 7(0~7 共 8 个)。
关联 · 子集枚举(B3):位运算选子集—— 只适合小 n。
验算: 行 ✓
01#include <algorithm> 02int a[3] = {1, 2, 3}; 03do { 04 for (int i = 0; i < 3; i++) cout << a[i]; 05 cout << endl; 06} while (next_permutation(a, a + 3));
判断题:共输出 行( 个全排列),第一行是 123。
考点:next_permutation(K2)。
实现要点:全排列 = do-while(next_permutation(a, a+3))——do-while(不是 while)保证第一个排列也输出;数组要先升序。
解析:3 个元素 6 个排列,第一行 123。✅ 正确
排除法:无(判断题)。混淆点:while 版会跳过初始排列——do-while 是排列枚举的标准姿势。
关联 · 排列枚举(B4):——字典序逐个生成。
大纲注:next_permutation不在入门级 STL 白名单(min/max/swap/sort),属枚举排列的便捷工具。
01// 枚举 1~n 中三个数 i<j<k 且 i+j+k==10 的组合 02int n = 10, cnt = 0; 03for (int i = 1; i <= n; i++) 04 for (int j = i + 1; j <= n; j++) 05 for (int k = j + 1; k <= n; k++) 06 if (i + j + k == 10) cnt++; 07cout << cnt;
判断题:输出 ((1,2,7)、(1,3,6)、(1,4,5)、(2,3,5))。
考点:三数组合(K3)。
实现要点:三重循环 (起点层层 +1)+ 条件 i+j+k==10——"组合"防止重复,判断筛答案。
解析:(1,2,7)(1,3,6)(1,4,5)(2,3,5) 共 4 组。✅ 正确
排除法:无(判断题)。混淆点:(1,4,5) 与 (2,3,5) 等都要数——条件与顺序配合。
关联 · 三角形枚举(J4):三重组合的同族。
验算:4 组 ✓
01// 枚举 n 的所有因数(i <= sqrt(n),每次找到 i 和 n/i 两个) 02int n = 12; 03for (int i = 1; i * i <= n; i++) 04 if (n % i == 0) { 05 cout << i << ' '; 06 if (i * i != n) cout << n / i << ' '; 07 }
判断题:输出的因数个数为 (1, 2, 3, 4, 6, 12)。
考点:枚举因数(K4)。
实现要点:因数成对:枚举到 ,每次 i 与 n/i 两个因数;完全平方数()只算一次——"成对枚举"从 到 。
解析:12 的因数 6 个。✅ 正确
排除法:无(判断题)。混淆点:if (i * i != n) 防 36 的 6 输出两次——自配对判断。
关联 · 因数枚举(B5):边界缩小到 的经典。
验算:1,2,3,4,6,12 ✓
01// 判断 n 是否是素数:枚举 2 ~ sqrt(n) 看有无因数 02bool isPrime(int n) { 03 if (n < 2) return false; 04 for (int i = 2; i * i <= n; i++) 05 if (n % i == 0) return false; 06 return true; 07}
判断题:isPrime(1) 返回 false、isPrime(2) 返回 true。
考点:枚举素数(K5)。
实现要点:判素数 = 枚举 找因数,找到即 return false;n < 2 先排除——"找到即返回"是存在性剪枝。
解析:1 不是素数、2 是素数。✅ 正确
排除法:无(判断题)。混淆点:2 是最小素数(i*i<=n 对 2 不进入循环直接 true)——特判要写对。
关联 · 枚举答案验证(E4):isPrime 是判断函数——枚举素数表时复用。
01// 判断 n 是否为回文数:反转后与原数相等 02bool isPal(int n) { 03 int rev = 0, t = n; 04 while (t) { rev = rev * 10 + t % 10; t /= 10; } 05 return rev == n; 06}
判断题:isPal(121) 返回 true、isPal(123) 返回 false。
考点:枚举回文数(K6)。
实现要点:判回文 = 数字反转(rev = rev*10 + t%10; t/=10)与原数比较——"反转相等"法;逐位拆解是核心。
解析:121 回文、123 不是。✅ 正确
排除法:无(判断题)。混淆点:字符串法(s == reverse(s))也行——数字法免字符串转换。
关联 · 回文数枚举(B6):判断函数化——枚举 1~1000 时逐个数调用。
01// 枚举 x 从 1 到 100,验证 x^2 的个位数是否等于 x 的个位数 02int cnt = 0; 03for (int x = 1; x <= 100; x++) 04 if ((x * x) % 10 == x % 10) cnt++; 05cout << cnt;
判断题:输出 (个位为 0、1、5、6 的数满足,每类 10 个)。
考点:枚举答案验证(K7)。
实现要点:枚举 + 验证条件 (x*x)%10 == x%10——"答案候选枚举 + 条件验证"模式;个位 0/1/5/6 满足(自平方保个位)。
解析:1~100 中 4 类个位 × 10 = 40 个。✅ 正确
排除法:无(判断题)。混淆点:只数个位 1 会漏 0、5、6——条件要等价翻译完整。
关联 · 枚举答案验证(E4):验证条件独立成判断——枚举的主体不变。
验算: ✓
01// 约瑟夫:n 人围圈,报数到 k 出列(用 bool 数组标记出列) 02int n = 5, k = 2; 03bool out[6] = {false}; 04int cnt = 0, pos = 0, remain = n; 05while (remain > 0) { 06 pos = pos % n + 1; // 下一个人(1..n 循环) 07 if (out[pos]) continue; // 已出列跳过 08 cnt++; 09 if (cnt == k) { 10 cout << pos << ' '; 11 out[pos] = true; 12 cnt = 0; 13 remain--; 14 } 15}
判断题:输出 2 4 1 5 3。
考点:约瑟夫模拟(L1)。
实现要点:约瑟夫数组版三件套:bool 出列标记 + 循环编号(pos%n+1)+ 报数计数(cnt 到 k 重置)——已出列者 continue 跳过(不占报数);报数到 k 出列并清零计数。
解析:n=5,k=2 出列 2 4 1 5 3。✅ 正确
排除法:无(判断题)。混淆点:已出列的人跳过报数(continue 在计数前)——出列顺序对的前提。
关联 · 约瑟夫(D1):数组版模板——报数+出列循环。
验算:2、4、1、5、3 ✓
01// 1~10 报数,报到 3 的倍数输出该数,报到 5 的倍数输出"Fizz" 02for (int i = 1; i <= 10; i++) { 03 if (i % 3 == 0) cout << i << ' '; 04 if (i % 5 == 0) cout << "Fizz "; 05}
判断题:输出中依次出现 3、Fizz、6、9、Fizz(3 的倍数输出数字,5 的倍数输出 Fizz;5 和 10 只输出 Fizz 不输出数字)。
考点:报数游戏(L2)。
实现要点:报数条件输出:3 的倍数输出数字、5 的倍数输出 Fizz——两个独立 if(不是 else-if),15 这类数两种都输出;i=5/10 只输出 Fizz(不是 3 的倍数)。
解析:输出 3、Fizz、6、9、Fizz。✅ 正确
排除法:无(判断题)。混淆点:else-if 会让 15 只输出一种——独立 if 才"并列判断"。
关联 · 枚举找数(B1):多条件独立判断——输出类模拟的常见形态。
验算:i=3→3;i=5→Fizz;i=6→6;i=9→9;i=10→Fizz ✓
01// 2020 年(闰年)各月天数 02int days[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 03// 1 月 1 日到 3 月 1 日的天数: 04int sum = days[1] + days[2]; 05cout << sum;
判断题:输出 (31 + 29 = 60)。
考点:日期天数(L3)。
实现要点:日期计算 = 每月天数表(days[13],下标即月)+ 累加——闰年 2 月 29;"到 3 月 1 日" = 1 月 + 2 月的天数。
解析:2020 闰年:31 + 29 = 60。✅ 正确
排除法:无(判断题)。混淆点:平年 2 月 28——闰年判断先做(year%4==0 且 century 例外)。
关联 · 日期计算(D3):天数表是日期题的标准配置。
验算: ✓
01int t = 3661; // 秒 02int h = t / 3600; 03int m = t % 3600 / 60; 04int s = t % 60; 05cout << h << ' ' << m << ' ' << s;
判断题:输出 1 1 1(1 小时 1 分 1 秒)。
考点:时分秒(L4)。
实现要点:秒拆时分秒:时 = t/3600、分 = t%3600/60、秒 = t%60——先除大单位、再取余拆小单位。
解析:3661 = 1:1:1。✅ 正确
排除法:无(判断题)。混淆点:t%3600/60 顺序(先取余再去分)——写成 t/60%60 也行但易错。
关联 · 时间换算(D4):三级进位拆解。
验算: ✓
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) { 04 for (int j = 1; j <= n - i; j++) cout << ' '; 05 for (int j = 1; j <= 2 * i - 1; j++) cout << '*'; 06 cout << endl; 07}
输入 时输出:
* *** *****
判断题:这是一个 3 行居中的星号塔(星号数依次 1、3、5)。
考点:星号塔(L5)。
实现要点:星号塔 = 外层行 i + 两段内层(前导空格 个 + 星号 个)——"空格定位置、星号定形状"。
解析:n=3 输出 1、3、5 个星号的塔。✅ 正确
排除法:无(判断题)。混淆点:星号数 (奇数序列)——写 就成右三角。
关联 · 图形输出(D5):每行两段式——图形题的通用结构。
01int n; 02cin >> n; 03for (int i = 1; i <= n; i++) { 04 for (int j = 1; j <= i; j++) 05 cout << j << ' '; 06 cout << endl; 07}
输入 时输出:
1 1 2 1 2 3
判断题:第三行输出 1 2 3。
考点:数字三角形(L6)。
实现要点:数字三角形 = 外层 i + 内层 j <= i 输出 j——内层上界随外层变化(三角形标志);与乘法表同构(L6 输出 j、J6 输出 i*j)。
解析:n=3 第三行 1 2 3。✅ 正确
排除法:无(判断题)。混淆点:内层 j <= n 是矩形——三角形靠 j <= i。
关联 · 图形输出(D5):行号与列数的关系 = 图形公式。
01// 52 张牌轮流发给 4 个人(0~3 号),第 i 张发给 i % 4 02int cnt[4] = {0}; 03for (int i = 0; i < 52; i++) 04 cnt[i % 4]++; 05for (int p = 0; p < 4; p++) cout << cnt[p] << ' ';
判断题:输出 13 13 13 13(每人 13 张)。
考点:发牌模拟(L7)。
实现要点:轮流分配 = 取模:第 i 张给 i % 4 号人——循环分配的标准写法;统计每人数量用计数数组。
解析:52 张 ÷ 4 人 = 13 张/人。✅ 正确
排除法:无(判断题)。混淆点:编号从 0 起(0~3)才直接 i%4——1 起要 (i-1)%4+1。
关联 · 发牌模拟(D2):取模 = 轮流——循环分配的钥匙。
验算: ✓
01// 初始 x = 0,执行指令:+3 -2 +5 -1 02int x = 0; 03x += 3; 04x -= 2; 05x += 5; 06x -= 1; 07cout << x;
判断题:上述代码输出 。
考点:指令序列(M1)。
实现要点:指令序列模拟 = 一个变量按序执行指令——状态(x)+ 指令(+3/-2/...)一维更新;循环读指令时同样模式。
解析:0+3-2+5-1 = 5。✅ 正确
排除法:无(判断题)。混淆点:读入版用循环 + 运算符字符判断——加减法的顺序执行。
关联 · 指令序列(F5):最小模拟——变量就是状态。
验算: ✓
01// 操作序列:push 1、push 2、pop、push 3、pop、pop(每次 pop 输出) 02stack<int> st; 03st.push(1); st.push(2); 04cout << st.top() << ' '; st.pop(); 05st.push(3); 06cout << st.top() << ' '; st.pop(); 07cout << st.top() << ' '; st.pop();
判断题:上述代码输出 2 3 1。
考点:栈操作模拟(M2)。
实现要点:栈指令模拟 = push/pop 按序执行——pop 前先 top 取出再删;输出顺序 = LIFO(后进先出)。
解析:push1 push2 pop(2) push3 pop(3) pop(1) → 2 3 1。✅ 正确
排除法:无(判断题)。混淆点:pop 输出的是栈顶(最后 push 的)——先 2 后 3 最后 1。
关联 · 栈(第 8 章):指令驱动栈——操作序列模拟的经典。
验算:[1,2]→[1]→[1,3]→[1]→[]:2 3 1 ✓
01// 甲乙轮流取数(每轮各取 1 个),甲先手,共 3 轮 02// 甲取 2、乙取 3、甲取 1、乙取 5、甲取 4、乙取 6 03int A = 0, B = 0; 04for (int r = 1; r <= 3; r++) { 05 int a, b; 06 cin >> a >> b; 07 A += a; B += b; 08} 09cout << A << ' ' << B;
判断题:输入 2 3 1 5 4 6 时输出 7 14。
考点:回合制游戏(M3)。
实现要点:回合制 = 外层循环轮数 + 每轮读入并累加双方得分——读入顺序与累加对象要对应清楚。
解析:甲 2+1+4=7、乙 3+5+6=14。✅ 正确
排除法:无(判断题)。混淆点:每轮两个数先甲后乙——顺序读错则比分颠倒。
关联 · 回合制(F6):轮 = 循环——每轮一个完整回合。
验算:、 ✓
01// 循环数组:3 个元素 a[0..2],从头走 7 步依次输出 02int a[3] = {1, 2, 3}; 03for (int i = 0; i < 7; i++) 04 cout << a[i % 3] << ' ';
判断题:输出 1 2 3 1 2 3 1。
考点:循环数组(M4)。
实现要点:循环访问 = a[i % 3]——下标越界取模绕回;走 7 步 = 7 次循环输出(2 轮 + 1)。
解析:1 2 3 1 2 3 1。✅ 正确
排除法:无(判断题)。混淆点:i % 3 的结果 0、1、2 循环——数组长度即模数。
关联 · 循环数组(F2):取模循环的直观例子。
验算:7 = 2×3+1 → 1 2 3 1 2 3 1 ✓
01// 3 盏灯(编号 1~3,初始全开),按编号 2 的灯:状态翻转(开→关) 02bool on[4] = {false, true, true, true}; 03on[2] = !on[2]; 04for (int i = 1; i <= 3; i++) cout << (on[i] ? '开' : '关') << ' ';
判断题:输出 开 关 开(2 号灯被关掉)。
考点:开关灯(M5)。
实现要点:状态翻转 = on[2] = !on[2]——bool 状态取反即"开↔关";二进制状态压缩的布尔数组版。
解析:2 号灯翻转 → 开 关 开。✅ 正确
排除法:无(判断题)。混淆点:多盏灯全翻转 = 循环取反——状态转移的最小形态。
关联 · 二进制状态(F3):bool 数组与位运算两种实现同一状态。
01// 细菌繁殖:初始 1 个,每小时翻倍,问 5 小时后数量 02int x = 1; 03for (int h = 1; h <= 5; h++) 04 x *= 2; 05cout << x;
判断题:输出 ()。
考点:多轮模拟(M6)。
实现要点:多轮更新 = 循环轮数 + 每轮状态翻倍(x *= 2)——每轮状态 = 上轮 × 2;指数增长。
解析:。✅ 正确
排除法:无(判断题)。混淆点:x += 2 是线性增长(×2 才是翻倍)——运算符看仔细。
关联 · 回合制(F6):轮 = 循环——每轮一次乘法更新。
验算: ✓
01// 输出 1 到 n 的所有偶数 02int n; 03cin >> n; 04for (int i = 1; i <= n; i++) 05 if (______) cout << i << ' ';
横线处应填( )。
考点:补全枚举循环(N1)。
实现要点:偶数条件 = i % 2 == 0——补全题考"条件翻译":文字条件 → 布尔表达式。
解析:✅ A
排除法:B 是奇数;C i/2==0 只对 i=0,1 成立;D 与条件无关。
关联 · 枚举找数(B1):条件翻译是枚举补全的核心。
01// 统计 1~n 中偶数的个数 02int n, cnt = 0; 03cin >> n; 04for (int i = 1; i <= n; i++) 05 if (i % 2 == 0) ______; 06cout << cnt;
横线处应填( )。
考点:补全枚举计数(N2)。
实现要点:计数更新 = cnt++——条件内计数器加一;位置在 if 内。
解析:✅ A
排除法:B 清零(白枚举);C 覆盖为 i;D 改循环变量。
关联 · 枚举计数(G3):
if (条件) cnt++是计数三行式。
01const int MAXN = 100; 02int n, k, pos = 0, cnt = 0, remain; 03bool out[MAXN]; // out[i] = true 表示编号 i 已出列 04cin >> n >> k; 05remain = n; 06 07// 约瑟夫出列:pos 指向当前报数人,出列后把出列标记为 true 08while (remain > 0) { 09 pos = pos % n + 1; 10 if (______) continue; // 已出列的人跳过 11 cnt++; 12 if (cnt == k) { // 报到 k:出列 13 cout << pos << ' '; 14 out[pos] = true; 15 cnt = 0; 16 remain--; 17 } 18}
横线处应填( )。
考点:补全约瑟夫(N3)。
实现要点:出列者跳过 = if (out[pos]) continue——已出列不参与报数;补全考"跳过条件"。
解析:✅ A
排除法:B 条件反(在场的人被跳过);C/D 语义错误。
关联 · 约瑟夫模拟(L1):continue 跳过已出列——报数连续性由它保证。
01// 2020 年(闰年)2 月有 29 天 02int days[13] = {0, 31, ______, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
横线处应填( )。
考点:补全日期天数(N4)。
实现要点:闰年 2 月 = 29 天——天数表第 2 位填 29;平年 28(2020 是闰年)。
解析:✅ A
排除法:B 平年天数;C/D 月份错位。
关联 · 日期天数(L3):天数表按"平/闰"选版本。
01int n = 3; // 输出 n 行星号塔(n=3:第一行" *"、第二行" ***"、第三行"*****") 02for (int i = 1; i <= n; i++) { 03 for (int j = 1; j <= n - i; j++) cout << ' '; 04 for (int j = 1; j <= ______; j++) cout << '*'; 05 cout << endl; 06}
横线处应填( )。
考点:补全图形输出(N5)。
实现要点:星号塔星号数 = 2 * i - 1(第 i 行奇数个)——图形公式是补全的考点。
解析:✅ A
排除法:B i 成右三角;C 2i 偶数塔;D n-i 递减。
关联 · 星号塔(L5):——行号与星号数的关系。
01int n = 3; // 枚举 {1..n} 的子集:mask 的二进制第 i 位为 1 表示选 i+1 02for (int mask = 0; mask < ______; mask++) { 03 for (int i = 0; i < n; i++) 04 if (mask & (1 << i)) cout << i + 1 << ' '; 05 cout << endl; 06}
横线处应填( )。
考点:补全子集枚举(N6)。
实现要点:子集总数 = 1 << n()——mask 循环上界;(1<<n)-1 是最后一个 mask(上界用 <)。
解析:✅ A
排除法:B 漏了 2 的幂;C 少一个(会漏最后一个子集);D 线性错。
关联 · 子集枚举(K1): 个子集——上界
< (1<<n)。
01// 细菌每小时翻倍,模拟 h 小时 02int h = 4; // 模拟 4 小时 03int x = 1; 04for (int i = 1; i <= h; i++) 05 ______; 06cout << x;
横线处应填( )。
考点:补全模拟更新(N7)。
实现要点:翻倍更新 = x *= 2(等价 x = x*2)——每轮状态更新的语句。
解析:✅ A
排除法:B 加 2(线性);C 恒 2;D 加 1。
关联 · 多轮模拟(M6):更新语句是模拟的心脏。
01// 统计 1~100 中"个位数是 3"的数的个数 02int cnt = 0; 03for (int i = 1; i <= 100; i++) 04 if (i % 10 == 3) cnt++; 05cout << cnt;
输出为( )。
考点:枚举统计个数(O1)。
实现要点:条件统计:个位数 = i % 10——3, 13, ..., 93 每十个一个,共 10 个。
解析:10 个。✅ A
排除法:B 漏了 3 本身或 93;C 多数;D 只数 3。
关联 · 枚举计数(G3):取个位
%10——数位操作与计数组合。
验算:3~93 共 10 个 ✓
01// 汽车里程:每小时 +60 公里,输出 5 小时的累计里程(每小时一行) 02int d = 0; 03for (int h = 1; h <= 5; h++) { 04 d += 60; 05 cout << h << "小时: " << d << "公里" << endl; 06}
判断题:最后一行的里程是 公里。
考点:模拟完整输出(O2)。
实现要点:逐时累加里程:每轮 d += 60 并输出一行——"每轮一行"的日志式输出;5 小时 300 公里。
解析:最后一轮 300 公里。✅ 正确
排除法:无(判断题)。混淆点:输出在循环内(每轮都打)——放循环外只有最终值。
关联 · 多轮模拟(M6):每轮输出 = 过程可视化(也是 F7 的调试手段)。
01// 找出 1~50 中因数最多的数(因数个数最大) 02int best = 0, bestN = 0; 03for (int i = 1; i <= 50; i++) { 04 int c = 0; 05 for (int j = 1; j <= i; j++) 06 if (i % j == 0) c++; 07 if (c > best) { best = c; bestN = i; } 08} 09cout << bestN;
判断题:输出 (1~50 中 48 的因数最多)。
考点:枚举最值综合(O3)。
实现要点:双重枚举求"因数最多":外层枚举候选数、内层数它的因数、外层比较更新最优——枚举 + 计数 + 最值三层结构。
解析:1~50 中 48 因数最多(10 个)。✅ 正确
排除法:无(判断题)。混淆点:36 有 9 个(次多)——48 才是冠军。
关联 · 枚举最值(G4):最值里嵌计数——综合枚举的典型。
验算:48 的因数 1,2,3,4,6,8,12,16,24,48 = 10 个 ✓
01int n; 02cin >> n; 03for (int i = n; i >= 1; i--) { 04 for (int j = 1; j <= i; j++) 05 cout << '*'; 06 cout << endl; 07}
输入 时输出(倒三角,星号数依次 4、3、2、1):
**** *** ** *
判断题:上述输出是 4 行倒三角。
考点:图形综合输出(O4)。
实现要点:倒三角 = 外层逆序(i 从 n 到 1)+ 内层 j <= i——正三角反过来;每行星号数 = 行号递减。
解析:n=4 → 4,3,2,1 星号。✅ 正确
排除法:无(判断题)。混淆点:外升序 + j <= i 是正三角——外层方向决定正倒。
关联 · 图形输出(D5):逆序外层 = 倒立——图形题的方向变换。
01// 模拟翻倍 + 枚举判断:1 到 100 里,翻倍 3 次(乘 8)后超过 500 的最小数 02int ans = 0; 03for (int i = 1; i <= 100; i++) { 04 int t = i; 05 for (int k = 1; k <= 3; k++) t *= 2; 06 if (t > 500) { ans = i; break; } 07} 08cout << ans;
输出为( )。
考点:模拟枚举混合(O5)。
实现要点:混合题 = 外层枚举候选 + 内层模拟翻倍 + 条件早停(break)——"找到第一个就停"用 break 跳出外层。
解析:63 × 8 = 504 > 500 第一个。✅ A
排除法:B :(不够);C 是 63 的下一项;D 无来源。
关联 · 存在性早停(G5):break 找第一个满足——枚举+模拟的组合。
验算: ✓
01// 想输出 1 到 10,却写成: 02for (int i = 1; i < 10; i++) 03 cout << i << ' ';
判断题:i < 10 会漏掉 10(只输出 1~9)——应写 i <= 10。
考点:循环边界漏(P1)。
实现要点:i < 10 不含 10——"1 到 10"要 i <= 10;边界差一题(off-by-one)的根源。
解析:漏掉 10。✅ 正确
排除法:无(判断题)。混淆点:< 上界是"开区间"、<= 是"闭区间"——先数清"要不要端点"。
关联 · 枚举边界(H1):
<=vs<——枚举第一坑。
01// 多组数据:每组统计偶数的个数,但 cnt 没有在每组开始时清零 02int q, n, cnt = 0; 03cin >> q; 04while (q--) { 05 cin >> n; 06 // 忘记 cnt = 0; 07 for (int i = 1; i <= n; i++) 08 if (i % 2 == 0) cnt++; 09 cout << cnt << endl; 10}
判断题:cnt 会跨组累加——第二组及以后的结果被上组污染。
考点:循环变量不重置(P2)。
实现要点:多组数据每组开始要 cnt = 0——忘重置则跨组累加;重置语句放在每组循环体开头。
解析:cnt 跨组污染。✅ 正确
排除法:无(判断题)。混淆点:把 cnt 声明在循环内也可自动重置——作用域即生命周期。
关联 · 循环变量重置(H3):多组数据的头号 bug。
01// 想模拟计数到 10,但忘记更新循环变量: 02int i = 1; 03while (i <= 10) { 04 cout << i << ' '; 05 // 忘记 i++; 06}
判断题:i 永远是 1,循环条件永远为真——死循环(无限输出 1)。
考点:死循环(P3)。
实现要点:while 缺 i++ → 条件永远为真 → 死循环——循环变量必须推进(for 自带、while 手写)。
解析:无限输出 1。✅ 正确
排除法:无(判断题)。混淆点:for 的步进在头部、while 的步进在体内——忘写即死。
关联 · 模拟死循环(H4):状态不推进 = 死循环。
01// 输出 1 到 n,要求数字之间用空格隔开 02for (int i = 1; i <= n; i++) 03 cout << i << (i == n ? '\n' : ' ');
判断题:这样写保证最后一个数字后是换行而不是多余空格。
考点:输出格式(P4)。
实现要点:分隔符处理 = 三目 i == n ? '\n' : ' '——最后一个换行、其余空格;"行尾无多余空格"的标准姿势。
解析:最后一个输出换行。✅ 正确
排除法:无(判断题)。混淆点:每项都输出换行 = 一行一个(错);每项都空格 = 行尾多余空格(可能判错)。
关联 · 输出格式(G6):格式 = 得分点——三目处理分隔。
下列说法错误的是( )。
考点:综合判断(P5)。
解析:D 错误——枚举 是单重循环 ; 是双重(数对)。✅ D
排除法:A 数对 ✓;B 模拟按规则更新 ✓;C 约瑟夫数组模拟 ✓。
关联 · 本章串联:A(A4/A5)、B(C3)、C(D1)、D(A3)——综合题 = 细节判断的集合。