从零开始,入坑编程比赛
1. 什么是编程比赛?
编程比赛,一般称为程序设计竞赛,要求选手在有限的时间内编写程序,分析和解决问题。
国内比较出名的比赛有:
OI(Olympiad in Informatics,信息学奥林匹克竞赛),是高中五大学科竞赛之一。
ICPC(International Collegiate Programming Contest,国际大学生程序设计竞赛),由 ICPC 基金会(ICPC Foundation)举办,是最具影响力的大学生计算机竞赛。由于以前 ACM 赞助这个竞赛,也有很多人习惯叫它 ACM 竞赛。
蓝桥杯,由中华人民共和国工业和信息化部人才交流中心主办(据相关新闻,2026届起已与工信部脱钩),从中小学到大学高校一直备受青睐,是参加人数多,知名度较高的比赛之一。
码蹄杯,是由全国高等学校计算机教育研究会主办、清华大学出版社承办的编程竞赛,截至2025年举办了六届,也是目前备受青睐的,知名度较高的编程比赛之一。
百度之星,由百度公司于2005年发起并主办的年度程序设计竞赛,初赛不限制参赛选手身份要求,是影响力较大,含金量较高的编程比赛之一。
1.1 关于难度与含金量

注:关于评分码蹄杯比蓝桥杯难度高:码蹄杯题目数量更大,且难度与蓝桥杯大差不差(有些更难)。另外该图表只反映外界的普遍共识,但对于我们普通人来说,无论你参加了哪个比赛都很棒!
2. 关于各种算法比赛的介绍
2.1 不同的赛制
根据不同的比赛规则,需要采取不同的策略来完成比赛。
2.2 比赛规则之如何评分
每道算法题会有若干个检测点。检测点具体是什么东西,如何判断的呢?
举个例子,你编写了一个程序,现在有各种各样的用户来做测试,如果一个用户用完你的程序没有问题,体验好,那你就通过了检测。反之,如果用户做出了你没考虑到的操作,导致程序失灵出现错误,那么这个检测你就没有通过。
对应到程序竞赛中来说,程序每通过一个样例,没有报错,输出了符合答案预期的结果,那么这个检测点你就通过了,反之则没有通过。一般一道题会有几十个,甚至上百个这样的样例来全面,系统的检测你的程序设计是否合理(包括程序设计方法,时间,空间复杂度等多维度综合考虑)。
2.3 一道题举例
蓝桥杯官网[19728 拼十字]
官网题库练习界面,有调试和提交检测按钮。调试按钮使用第一个节点的测试数据测试程序能不能得到正确结果,提交检测会检测所有测试数据,最后给出完整的结果。

怎样的答案才算是正确答案? 1.程序逻辑正确 2.满足时间复杂度和空间复杂度的要求

根据选择使用的算法不同,复杂度不同,通过率会有差别。20个检测点,使用回溯算法,通过6个,得6分。


==在正式比赛中,需要在指定位置上传自己的程序代码。看不到提交后的结果,不能进行调试。检测方法就是根据题目要求,自己想例子手动测试。==
2.4 不同规则介绍
2.4.1 ICPC/ACM
形式:3人一队、1台电脑、5小时左右,题目 8–13 道。
评分:按解题数排序;同解题数按罚时(最后一次通过时间之和 + 每题若干分钟的错误罚时)升序。
特点:强调分工协作与代码实现速度;不允许上网;常见于 ICPC、CCPC 等。
2.4.2 OI/IOI
形式:个人参赛,通常 2 天,每天 3 题,每题含多个子任务。
评分:部分分(子任务通过即得分),总分排名。
特点:重算法设计与正确性证明,时间更充裕;不比速度,比解法完整度与稳健性;中学阶段的 NOI/IOI 属此类。
2.4.3 “ICPC 变体”的个人赛(常见于线上平台)
代表:Codeforces、AtCoder、LeetCode 周赛等。
形式:个人参赛,时长 1.5–2.5 小时不等,若干题(难度递增)。
评分:
Codeforces:解题数优先,罚时(含错误提交罚时)作为细则;部分轮次带Hack/Challenge与系统测试。
AtCoder:固定题分,解得越早罚时越小(每次 WA 追加罚时),总分→罚时。
LeetCode:以解题数与完成时间排序,普遍带错误罚时(平台规则偶有调整)。
特点:节奏快、梯度清晰,适合周练与水平特征化评估(Rating)。
蓝桥杯采用IO赛制,码蹄杯采用ACM赛制,都是个人赛
3. 我要参加算法比赛,需要掌握哪些知识?
入门
基础数据结构:数组,链表,字符串,栈与队列,二叉树,图论(BFS/DFS、拓扑排序、最短路(Dijkstra/Bellman-Ford)、最小生成树(Kruskal/Prim))
基础算法套路:双指针/滑动窗口、前缀和/差分、二分, 回溯与递归,动态规划
基础数学:整除与同余、快速幂、GCD/LCM
进阶
高级数据结构:线段树(区间加/取 min/max/sum、懒标记)、树状数组、可持久化思想、Treap/Splay(了解)。
图论扩展:最短路变体(SPFA 注意反例)、0-1 BFS、多源 BFS、差分约束;强连通分量(Kosaraju/Tarjan)、桥与割点、树直径、最近公共祖先(倍增/树剖)。
流/匹配:最大流(Dinic/ISAP)、最小割、二分图匹配(匈牙利/网络流)、最小费用最大流(了解)。
动态规划:背包(多维/多重/分组)、区间 DP、树形 DP、状态压缩 DP(bitmask)、数位 DP。
数学进阶:组合数与预处理(阶乘/逆元/卢卡斯)、容斥、矩阵快速幂、同余方程(EXGCD)、中国剩余定理(CRT)。
高阶
高级图论:最短路分层图、树分治/点分治、虚树、支配树(了解)、2-SAT。
高级字符串:Z 函数、Manacher、后缀数组/后缀自动机(SAM)、AC 自动机。
高阶数据结构:可持久化线段树/平衡树、李超线段树、分块与莫队(含带修改)。
高数与数论加强:多项式(NTT/FFT)、拉格朗日插值、组合数变换、线性基。
启发式与优化:启发式合并、分治优化/四边形不等式优化 DP、位运算黑科技、随机化与期望分析。
4.推荐的学习路径
第一步
你需要彻底掌握一门编程语言的基础使用,如循环,分支等,各种核心库中常用的函数都需要掌握。
资料推荐:这部分的资料在B站上很多,也都讲的很好,这里不做具体推荐
学习建议:每个部分都要动手敲一遍,掌握并做笔记。只看一遍即可,后续通过刷算法题也可以对这部分进行巩固。
第二步
你需要学习一些基础的数据结构和算法知识,并用你掌握的编程语言进行实现。不需要学习很深入,但至少自己编程实现一遍,对算法有具体的了解
资料推荐:
【尚硅谷】数据结构与算法(Java数据结构与算法):基础的数据结构和算法部分都做了介绍,不需要深刻掌握,看一遍大概理解即可
代码随想录:更深入,讲解更细致的算法学习路线。作者在算法学习部分题目难度循序渐进,设置合理,不会让人感到很难,而是逐渐从易到难的理解各种算法的底层逻辑如何实现。并在B站有配套的视频课程。
学习建议:
可以先跟着网站刷题,不需要大量刷题,把学习过程中的题尽量都搞明白,并做好笔记记录
第三步及之后
进行算法学习,同时开始刷对应部分的算法题,了解熟悉各种不同类型的算法,并学会根据不同的题目使用何种不同的算法,在用到的时候能够实现。熟悉各种基础类型的算法后,继续深入更高难度的算法,同时保持做算法题并笔记记录的习惯。
资料推荐:
Leetcode(力扣) 世界知名的学习社区,算法题量广,用户基数大,包括周赛,月赛,社区氛围好,资源内容较完善,使用友好界面简洁。
ACM/LeetCode算法竞赛路线图,最全的算法学习地图! 使用树的形式,整理了大量算法题。可根据路线图进行对照学习
OI-WIKI 各类算法竞赛知识的知识整合站点,由一批热爱算法的小伙伴维护,比较偏理论介绍
AcWing 算法题库,各类题目较全,包括周赛,月赛
New Online Judge 算法题库,各种类型比赛的原题比较全
算法吧 个人算法网站,可与其他结合,对比学习使用
蓝桥杯题库 在准备蓝桥杯之前可在该题库上多刷些题,适应蓝桥杯比赛的难度。
学习建议:
这个阶段要大量刷题。但请注意:大量刷题也要注意技巧。不能说盲目的刷,我点开一页就直接开始了。最好是结合题目的难度和类型做分类来刷,刷几道这种类型,难度由低到高,记录一些笔记,再做几道那种类型,难度由低到高,做一些笔记。这样效率会更高一些。
大部分算法平台都会定期举行周赛,月赛等。也可以积极参加试手。
LeetCode平台的社区氛围很好,有很多技术大牛自发的组织个人刷题路线图和题库,以及针对题目十分详细的解题思路,大家可以多多参考。
算法学习是一个需要大量时间,不断重复的过程。在过程中不懂是很正常的,这种时候只需要多看几遍,多想一点。坚持就是胜利。
5.其他学习工具
善于使用GitHub, YouTube,收集优质学习资源,善于使用AI(Claude, ChatGPT, DeepSeek等)来辅助自己的学习。
正确使用AI工具
AI工具目前在编程竞赛方面实力很强,是一个很好的老师。我们应当让AI辅助我们,为我们进行细致深入的教学,而不是一股脑的让它做出来复制粘贴。
比如说如下场景:
1.某个算法概念你没听明白,对应的题目你完全没头绪
把题目和算法概念告诉AI,让其帮你细致的由浅到深讲解一遍,还不懂的话就重复以上过程,直到搞懂为止
2.卡在某道题,没头绪/出错不知如何解决
把题目和自己的代码告诉AI,让AI帮你指出问题所在和解决方法,注意不要直接把正确答案粘贴,而是要让AI帮助你把这道题彻底搞懂
需要注意的是:AI也是有可能出错的,我们在使用时不可一股脑全部相信。
6. 作者参加算法比赛的心路历程,希望能给你些参考
我是大二从石油化学学院转入信息工程学院的,但是我从初中开始就对计算机,编程这一块比较感兴趣,当时自己学过一些C语言,简单的单片机程序等,也早就听说过蓝桥杯的大名,想着有朝一日也能得奖证明自己。
进入本专业学习后,在老师的推荐下,我立马参加了蓝桥杯比赛,并决定使用Java来参加比赛(当时也是不理解,我看到各个不同类型的编程语言写算法题要求时间不同,就想着选个要求时间短点的。后来才了解,其实这只是由编程语言的性能决定的,你用哪种语言也不影响)。
之后的日子,就是一个字:学。我总共参加了两届编程比赛(一般都是一年一届)。在学的过程中,我要平衡我的日常课程和算法学习,做好时间规划很重要。当然,这还是需要花费大量时间和心血的事请,尤其是到第二次参加前,我要同时准备雅思考试和算法比赛,同时每天还有很长时间的实训课,每天起得比鸡早(6:30),回到宿舍堪比高中生(10点是宿舍限制回宿舍时间)。
期间也有很多的迷茫和心理压力,自我怀疑等等。觉得自己很笨是很稀疏平常的事请,能做的也就只有反复的学,直到学懂,掌握了为止。
我学习算法的时间不算长,从23年9月参加蓝桥杯到现在,也就两年多。但算法学习就是这样,需要你投入的时间成本很高,收入也不确定。不像那些水赛,你随便参加都能拿个奖。但是相应的,你确实能学到很多东西,培养自我学习能力,同时这些比赛相比大部分大学中的竞赛而言,还是较有含金量的。
总之,我们需要坚持,这里我把自己很喜欢的一句话送给大家,希望大家都能度过一段充实有意义的大学生活,并不断向自己的目标前进!
You, me or nobody is gonna hit as hard as life. But it ain’t about how hard you hit. It’s about how hard you can get hit and keep moving forward. How much can you take and keep moving forward. That’s how winning is done!



说些什么吧!