前言-编程语言基础(C++优先,避坑指南)
算法竞赛几乎默认 C++(效率高)。对于c++其实最重要的不多,但要学完所有内容。比如说起码去看完翁凯的c语言教程或者什么网课。然后在来学各种各样的语法和技巧详解算法竞赛学习规划
第一部分:必须掌握的初级硬知识(按优先级排序)
1. 时间复杂度与数据规模(最基础和简单的知识点)
看到题目先看数据范围,能立刻判断该用什么算法: n <= 20:允许暴力枚举(指数级)。 n <= 10^5:必须用 O(n log n)(排序、二分)。 n <= 10^6:只能 O(n)(线性扫描)。 不会算复杂度?记住:1秒内,循环次数超过 1e8 必超时。
2. 三大基础算法模块
暴力枚举(爆搜):别看不起暴力,竞赛前两题几乎都是暴力+剪枝。学会用 next_permutation(全排列)和递归生成组合。 二分查找:不只是找数字,更是二分答案(用于最小值最大化、最大值最小化问题)。这是新手性价比最高的算法,学完能解 20% 的难题。 排序与去重:sort() + unique() 的组合必背。
3. 基础数据结构
栈与队列:必会 stack 和 queue(BFS 用队列,括号匹配用栈)。 哈希表:必会 unordered_map / unordered_set(O(1) 查找,处理重复元素利器)。
4 初等数论(只学这三点)
模运算 (a+b)%mod(防止溢出)。 快速幂(pow 会爆精度且慢,必须手写快速幂)。 最大公约数 __gcd()(C++自带)。
第二部分:新手必须死磕的“肌肉记忆”技巧
技巧一:先写“暴力骗分”,再想正解
拿到题如果 5 分钟没思路,立刻写暴力(O(n^2)甚至O(n!))。有的竞赛是按点得分,暴力能拿 30%-60% 的分。写完暴力后再去优化,心里不慌。 万一暴力是对的呢
技巧二:极致的“对拍调试”
肉眼 Debug 是最蠢的。养成习惯:写代码时立刻在关键位置输出中间变量(cout << “debug: x=” << x << endl;)。 更高级的是“对拍”:写一个绝对正确的暴力小脚本,和一个优化的主程序,用随机数生成测试数据对比结果(这是找出隐蔽 Bug 的核武器)。 或者熟练使用编辑器后,一些编辑器可以查看编译过程
技巧三:不要用“数学推导”代替“代码模拟”
很多新手在纸上推半天公式,浪费时间。能用循环模拟的就别推公式,比如日期处理、进制转换,直接按人类思维一步步模拟,简单不易错。 (不是计算机就不要用手写推导)
技巧四:背模板,但只背“最小单元”
不要背整段代码,要背“核心 5 行”: 有的板子其实掌握核心就可以自己写一份出来 BFS(广度优先搜索)的队列四步走。 二分查找的 while(l<r) 模板(死记一种写法,搞混 mid 是否 +1 会死循环)。 前缀和差分数组的构建。
技巧五:学会看“错误反馈”
WA(Wrong Answer):多半是边界(n=1 或 0 的情况)没处理。 TLE(Time Limit Exceeded):死循环 or 忘了加 ios 同步流 or 算法复杂度高了。 RE(Runtime Error):数组越界(检查 vector 是否为空就 pop)。
如果这篇文章对你有帮助,欢迎分享给更多人!
部分信息可能已经过时