高山 发表于 2026-9-20 22:03:01

【CSP 第二轮】算法学习-使用for循环进行暴力枚举

本帖最后由 高山 于 2026-9-21 06:11 编辑


正所谓暴力出奇迹,骗分过样例
省一线255,但第三题却没有优化算法?
不如试试暴力枚举吧~


在本文中,我们将为鱼油讲述何为暴力枚举、如何使用暴力枚举、在哪些情况可以使用暴力枚举,以及其中的一些原理
请注意,阅读本系列通常需要您有一定的C++语言基础,并大致学习过C++算法,正在备考CSP-J/S第二轮。如您不是竞赛向,可前往小甲鱼官方教程/课程进行学习。

什么是暴力枚举?暴力枚举是一种简单直接的问题解决方法,它通过尝试所有可能的解来找出正确答案。虽然在效率上可能不如其他高级算法,但它的实现简单,适用范围广,是解决问题的有力工具。

暴力枚举,顾名思义,就是将问题的所有可能解逐一列举出来,然后一一验证,直到找到正确解。这种方法虽然看似粗暴,但对于规模较小的问题或者没有更优解法的情况下,往往是最直接有效的 方法。
正如引用中所展示的内容。在竞赛中的第三题,在您想不出更优质的算法时,使用暴力枚举或许可以通过部分测试点。
现在,让我们开始讲解循环枚举。您可以点开目录查看下一页了。
为了确保您能掌握踏实的知识点,我们希望您从头跟着本文联练习。这样,在本文章结束时,您就掌握这一知识点了。

使用for循环进行暴力枚举

先试试练习吧,试完成一个代码,
把 1 到 100 中所有能被 2 整除的数(也就是偶数)挑出来并打印,奇数直接跳过。最终输出是 2 4 6 8 10 12 … 96 98 100,一共 50 个数。
如何实现这个思路呢?


很简单对吧,把1~100的每个数都枚举一遍,不就可以了吗?
我们打算怎么做
思路很简单:逐个过一遍,符合条件的留下,不符合的扔掉。
让变量 i 从 1 开始,每次加 1,一直走到 100 —— 这就是 for (int i = 1; i <= 100; i++) 干的事;
每拿到一个 i,就用 i % 2 == 0 判断它是不是偶数。% 是取余运算,i % 2 的结果只有 0 和 1 两种:余数为 0 说明能被 2 整除,就是偶数;
判断成立就输出这个数,不成立就什么也不做,直接进入下一轮。
示意图:


如果您已经完成了您的代码,可以在此处提交进行测试
在下方「评论」中回复你的答案,可获得额外的鱼币、荣誉、贡献奖励!
**** Hidden Message *****


看到了吗?对于「从 1 到 100 逐个判断,把符合条件的数挑出来」这件事,本质上就是暴力枚举——我们不玩任何花活,老老实实把每一种可能都试一遍,再逐个判断它满不满足要求。当数据范围很小的时候,这种写法既好想又好写,几乎不会出错。

如果你已经习惯了使用for进行枚举,就可以试试这道题目啦


可使用配套OJ对本题进行评测->


【CSP 难度:入门组】奇数求和
枚举 · 循环 · 取余判断


题目描述
给定两个整数 l 和 r(1 ≤ l ≤ r ≤ 100000),请你求出 l 到 r 之间(包含 l 和 r)所有奇数的和。


输入格式
一行两个整数 l 和 r,之间用一个空格隔开。


输出格式
一行一个整数,表示所求的奇数之和。


样例输入
1 10

样例输出
25


样例说明
1 到 10 之间的奇数为 1、3、5、7、9,它们的和为 25。


数据范围
1 ≤ l ≤ r ≤ 100000。


思路分析
用循环把 l 到 r 的每个数都拿出来,逐个判断是不是奇数。判断方法是取余:i % 2 == 1 说明 i 是奇数,就把 i 加到答案里;否则跳过。

这题本质上就是最基础的暴力枚举:数据范围只有 10 万,循环一遍完全来得及。


参考代码

#include <iostream>
using namespace std;
int main() {
    int l, r;
    long long ans = 0;
    cin >> l >> r;
    for (int i = l; i <= r; i++) {
      if (i % 2 == 1) {
            ans += i;
      }
    }
    cout << ans << endl;
    return 0;
}

说明:答案可能超过 int 范围,因此 ans 要用 long long。
参考代码
**** Hidden Message *****
说明:由于 n ≤ 9,9! = 362880,直接枚举全部排列再逐个判断即可通过。

测试点信息:

关于使用for循环进行暴力枚举的特别提醒
在了解了正确使用for循环进行暴力枚举后,我们必须了解,在CSP中,除了第一题或万不得已,暴力枚举都是“骗分技巧”
您应该根据本文章内容,正确学习暴力的一些语法、应用,为后续做准备。


以下是一些引用部分的提醒,部分内容来源于AI生成,但您仍然可以进行参考


写在前面
很多同学以为「暴力枚举」就是 for 循环,其实它是一个完整的备考体系。从第一期的奇数求和,到后面要讲的区间枚举、前缀和、二分、子集枚举、对拍,是一条完整的链条。这里先给一张总纲地图,后面每期配 2 道题(一题讲解 + 一题留作练习)。


一、先搞懂复杂度
很多同学不是不会写,是写了超时。必须养成先看数据范围再决定能不能暴力的习惯。
**** Hidden Message *****

一句话:拿到题先算 n 的数量级,再判断暴力能不能过,这是 T1/T2 和 T3/T4 的分水岭。


二、五种基本枚举框架


类型写法典型题
单重循环for (i=l; i<=r; i++)奇数求和
双重循环枚举区间、两数之和最大子段和 O(n^2)
三重循环枚举三个数三角形计数
子集枚举for mask=0; mask<(1<<n); mask++背包、选数
排列枚举next_permutation 或 DFS全排列、好排列



三、枚举 + 优化,这是拿满分的套路
纯暴力在考场上只能过部分分,真正拿满分靠的是剪枝和优化:
1. 前缀和:区间求和从 O(n) 降到 O(1),T3 最高频的优化。
2. 双指针 / 滑动窗口:把 O(n^2) 的区间枚举压成 O(n)。
3. 二分答案:把「枚举答案再验证」变成 log n 次判断。
4. 打表 / 预处理:把重复计算提前算好存起来。


四、三个必会的基础模板
1. 素数筛(埃氏筛)——第一轮必考,第二轮常用。
2. gcd / 快速幂——数论题的基础积木,3 行代码但要默写熟练。
3. 模拟 + 标记数组——最容易拿满分的题型,按题意一步步做即可。


五、调试与对拍能力
这是很多人的盲区。建议从第一天就养成,下面是对拍脚本框架:


while true; do
    ./gen > test.in
    ./std < test.in > std.out
    ./my< test.in > my.out
    diff std.out my.out || break
done


能自己造数据、能自动比对,考场上就不慌。


六、考场策略(比多刷题更值钱)
1. 先做 T1,15 分钟内必须 AC,建立信心。
2. T2 看一眼数据范围,先写暴力拿部分分再想优化。
3. T3/T4 通常部分分很好拿,不要空着任何一题。
4. 最后 30 分钟只做两件事:检查文件读写、对拍。


七、避坑清单
**** Hidden Message *****

八、备考节奏建议
把上面 7 块做成 7 期专题,每期配 2 道题(一题讲解 + 一题留作练习),正好是一个月的备考节奏:第 1 期 单重循环(奇数求和)→ 第 2 期 双重循环 + 最大子段和 → 第 3 期 前缀和 → 第 4 期 二分 → 第 5 期 子集枚举 → 第 6 期 对拍实战 → 第 7 期 考场综合模拟。



以上为本帖全部内容,如果对你有帮助,可以选择下方的「评分」进行支持。

static/image/hrline/line1.png

在后续的系列中,我们将继续对CSP - J/S 第一轮的题目进行讲解,并为大家准备第二轮的复赛。
此外,在每一次第二轮练习中,我们都会为大家准备配套OJ和测试点信息方便大家复盘,也希望各位鱼油多多支持FC!

如您喜欢,请不要忘记「评分」和「评论」哟~感谢你对鱼C的支持!


static/image/hrline/line1.png
请不要大范围刷帖或违反《鱼C论坛规则》。请注意,出于鱼C论坛对于评分工具的限制,每日发出的评分有限,因此对您的优质评论不保证及时评分如未收到,请等待一些时间。在本专辑中,标注为【第二轮】的帖子,均在第一轮正式发布成绩、各省划定分数线、CCF公布认证等级后,进行关闭。部分除外。工作人员将根据参与度等情况,对本次回帖奖励的鱼币数、总数和总量进行调整。数量有限,先到先得。对于回帖中奖概率,请以论坛帖子功能上公示的为主,工作人员会进行调整。帖子变更后,工作人员如有说明,将通过【补充】功能进行设置。



tomok 发表于 2026-9-21 06:51:06

看看 答案

I会成功 发表于 2026-9-21 07:34:23

{:7_137:}

空python 发表于 2026-9-21 12:59:49

{:7_146:}

tater 发表于 2026-9-21 22:19:38

{:5_101:}

犇犇犇 发表于 2026-9-21 22:21:00

{:7_146:}

18770897845 发表于 2026-9-24 11:49:01

{:5_106:}

晓日 发表于 2026-9-25 10:57:06

我去

qiqicon. 发表于 2026-9-26 08:41:08

好厉害的算法
页: [1]
查看完整版本: 【CSP 第二轮】算法学习-使用for循环进行暴力枚举