枚举算法
基础概念
基通俗讲解
枚举 = 把所有可能情况一个一个试,满足条件就记录。简单可靠,是初赛“保底得分”的首选思路,尤其当数据范围不大时。
核心必背考点
背直接默写拿分
- 双层循环枚举两个数 a、b;三层枚举三个数。
- 配合
if条件筛选。 - 复杂度约 O(n²),n≤10³ 可接受。
高频难点 / 拉分考点
难考场极易丢分
枚举范围漏边界:如“1≤a≤b≤n”写成 a<b 会漏掉 a=b 的情况;或整除判断用 a%b==0 时 b 不能为 0。
出题陷阱
坑文字套路
- “互不相同”的条件易被忽略,导致重复计数。
- 计数题要判重,别把同一组算多次。
90分高分技巧
技速算捷径
初赛阅读枚举程序,先确定循环上下界与筛选条件,再少量代入几个值验证计数是否正确。
梯度真题
基础求 1~100 中 3 的倍数个数
枚举 i,判 i%3==0。
| 1 | int c=0; |
| 2 | for(int i=1;i<=100;i++) |
| 3 | if(i%3==0) c++; |
| 4 | cout<<c; |
▍解析:答案 33。
中档两数之和为定值
枚举 a, b 凑 sum。
| 1 | int n=10,sum=10,c=0; |
| 2 | for(int a=1;a<=n;a++) |
| 3 | for(int b=a+1;b<=n;b++) |
| 4 | if(a+b==sum) c++; |
| 5 | cout<<c; |
▍解析:答案数出满足 a<b 且 a+b=10 的对数 = 4(1+9,2+8,3+7,4+6)。
压轴百钱百鸡类
三重枚举公鸡/母鸡/小鸡。
| 1 | for(int x=0;x<=20;x++) |
| 2 | for(int y=0;y<=33;y++){ |
| 3 | int z=100-x-y; |
| 4 | if(z%3==0 && 5*x+3*y+z/3==100) cout<<x<<y<<z; |
| 5 | } |
▍解析:经典枚举 + 约束筛选。
记忆口诀
技📌 记忆口诀
“可能情形逐个试,条件筛选记心头;上下界要闭区间,互异判重莫遗漏。”
📝 本节自测共 6 题
做完点「提交本节自测」即时判分;单选 / 多选 / 填空混合,答错可一键收入错题本。
暴力枚举 a,b,c(各 1..n)判断 a+b==c,时间复杂度约? 易
✅ 正确答案:A
三重循环 O(n^3)。
优化枚举常配合 ____ (填两字方法)减少搜索量。 填空题 中
✅ 正确答案:剪枝
剪枝减少无效搜索。
适合用枚举/暴力的情况有?(多选) 多选题 难
✅ 正确答案:ABC
n=1e9 暴力不可行。
关于图的最短路,下列说法正确的有哪些?(多选) 多选题 难
✅ 正确答案:ABC
Dijkstra 忌负权;Bellman-Ford 容忍负权;Floyd 全源。最短路未必唯一。
两层嵌套循环(各 n 次)时间复杂度 O(n²),当 n=100 时约执行 ____ 次。(填空) 填空题 中
✅ 正确答案:10000
100×100 = 10000。
广度优先搜索 BFS 借助哪种数据结构实现?____(填空) 填空题 易
✅ 正确答案:队列
BFS 用队列保证逐层扩展。