当你轻启这份文档之时,或许你已经怀揣着对算法竞赛的向往与热情。然而,请允许我在此先行为你揭示一条残酷的真相——算法竞赛之路,是一条荆棘密布、挑战重重的征途。它不仅需要你拥有坚韧不拔的毅力,去应对那些深不可测的算法难题,还需要你拥有一颗勇于面对无数不确定因素的坚韧心灵。因此,若你已决意踏上这条充满挑战的道路,请务必做好迎接困难、付出汗水的充分准备。这将是一场充满智慧与勇气的较量,期待你的精彩表现。
赛制:第一种OI 赛制:选手仅有一次提交机会。比赛时无法看到评测结果,评分会在赛后公布。每道题都有多个测试点,根据每道题通过的测试点的数量获得相应的分数;每个测试点还可能会有部分分,即使只有部分数据通过也能拿到分数。例:NOIP、蓝桥杯都是 OI 赛制。第二种IOI 赛制:选手在比赛时有多次提交机会。比赛实时评测并返回结果,如果提交的结果是错误的,不会有任何惩罚。每道题都有多个测试点,根据每道题通过的测试点的数量获得相应的分数。例:APIO、IOI 都是 IOI 赛制。目前国内比赛也在逐渐向 IOI 赛制靠拢。第三种icpc赛制: ccpc/icpc采用的赛制一般是三个人组成一队使用一台机器,在比赛时有多次提交机会。比赛实时评测并返回结果,如果提交的结果错误会有 20 分钟的罚时,错误次数越多,加罚的时间也越长。每个题目只有在所有数据点全部正确后才能得到分数。比赛排名根据做题数来评判,做题数相同的,根据总用时来评判。总用时是每题用时的和。每题的用时是从比赛开始到做出该题的分钟数与该题的罚时之和。一些 ICPC 相关赛事中,比赛结束前一小时进行封榜,封榜后的提交和排名将无法被其他选手看见。在 ICPC 相关赛事中,选手允许带一定量的纸质资料。除 ICPC 和 CCPC 外,众多比赛也采用该赛制,如 LeetCode 周赛及全国编程大赛、牛客小白赛练习赛挑战赛等。
比赛使用语言:备赛的第一步确认好自己比赛所需要的语言,当然对于大多数人来讲到看到这篇文章的基本上已经确认下来了自己所需要的语言。目前国内来讲c/c++这个赛道是最卷的,因为一方面给很多比赛甚至都规定只可以使用c++,另一部分很多同学是从小就打c++算法比赛的,如国际奥林匹克竞赛,因此目前来讲很卷。Java赛道相对来讲没有这么的卷,可参加比赛相对来讲也比较多,因此算中等吧。Python赛道这个赛道相比较前两个来讲算是最简单的,可参加的比赛也没有大家想象中那么的丰富(受限于python运行速度很慢因此你可以参加的比赛大概率只可以参加蓝桥杯,反正目前来讲其他合适的我确实没有找 到。),因此相对来讲也还好。
备赛知识点:计算机数据结构与算法的相关知识和数学知识两个部分。我推荐的是以计算机数据结构与算法的知识为主,穿插学习数学知识。
具体可以参考以下我总结的学习路线:
第一阶段:学习比赛相关语言所需的基础知识。
第二阶段:学习计算机数据结构相关的知识:如栈,堆,队列等,这一部分可以去b站上找视频进行学习,然后去力扣上找相对应题目进行练习。
第三阶段:进入到算法的学习,首先先推荐一个很好用的学习网站:代码随想录,其他平台也是搜代码随想录,b站上有他的相关讲解视频,建议各位同学一定一定要按照代码随想录网站上的顺序学习并多刷几遍。这是目前我个人用下来感觉是最棒的算法学习网站。在这个阶段是最难熬的,而且它属于算法类的地基,因此一定要把这个基础打牢打实。这个阶段其实还要配合着力扣这个网站,每学习一个知识点就把这个阶段的知识点刷透,为未来打下基础。
第四阶段:刷题阶段,这个阶段建议使用力扣这个网站来刷题,当然也可使用如洛谷这种刷题网站来刷题,目前在程序员当中用的最多的应该还是力扣,但他的评测机制和大多数比赛还不太相同。刷题建议先刷前期算法学习阶段的错题,那个知识点不熟练就刷那个知识点。然后按照力扣网站上的题目难度等级,分等级刷呗。当然只刷题,时间久了会让你没有成就感,因此每隔一段时间可以配合上一些小pk赛,如卡码网上的模拟又或者像蓝桥云课算法双周赛,又或者力扣上的力扣竞赛这种给自己一个鼓励。
第五阶段:数学知识的学习,严格来讲这个不可以属于一个单独的阶段但后来我想了一下放到一个阶段也行,其实我在学习数学知识的时候,我刚开始没有很重视,死刷算法,后来刷真题的时候遇到了完全不会,这个时候很紧张拼命学但最后效果也不是特别好,所以建议各位同学早点穿插着刷一点,在这里也给各位推荐一个网站,这其实是一个讲oi赛制所有学习内容的网站,这里边有个数学专题专门讲解数学,时间允许的情况下建议一点点慢慢看呗。数学部分更多的是你要学会他其中的思想。
说完了上边的学习路线那么我们来进入到备赛阶段,这个阶段最应该刷的就是当前赛事的真题,也就是你参加那个赛事你就去刷那个比赛的官方真题和官方模拟题这两个东西的质量一定是最高的,其次就是重视当前备赛官网上的那些他们自己出的练习题,其实我感觉他也可以归为模拟题,都属于一类的。这个地方我还要多说一点,那就是当一道题你做不出来或者你的代码有错误的时候,做不出来的时候建议你可以去评论区看看其他人是如何做的,然后照着多打几遍理解他们的思路,但是当你看了好几遍都不会的时候就不要在再看了,直接跳过这道题。遇到自己的代码过不了一般有两种代码本身有错误,第二种过不了时间复杂度或者空间复杂度,本身有错误那就找错误,打断点测试看看错误出在哪里就去改进哪里。时间复杂度或者空间复杂度过不了那一般就是你的技术用的不对了,考虑更换技术吧。
备赛时间:其实个人是非常建议你们常态化备赛的,从你们对这种比赛感兴趣的那一刻起就开始备赛,起码你从选择参加某一个比赛时就要开始备赛,时间确实有点长,但因为你要学习的内容其实还是蛮多的,所以还是建议各位常态化备赛。
其他技术的使用:这一块我主要是想强调一下对于ai的使用,首先先说个人关键可以用但绝不可依赖,特别是绝对不可以一遇到问题或者错误就想着用ai帮助一下吧,我在有一段时间学习的时候遇到问题就特别喜欢丢给chatgpt结果就导致自己后来没有了自己排错错误的能力,然后就强制自己绝对不可以使用这些ai软件,然后适应了好久才找回来状态。
最后,非常感谢你可以看到这里,在这里我还想多说一点,早定方向早奋斗,你的未来一定更加光明。在目前十分严峻的就业环境之下,开发岗其实是非常不容易的,因此也推荐各位同学在参加某一项大赛的同时可以将他相对应的技术一起利用业余时间进行学习,如你学习Java那你可能未来要走java开发,这种情况下类似于springboot这种你是不是应该先行练习着,你可能会问,那我要学习那些东西?这个时候我推荐大家可以多逛逛招聘网站如boss招聘或者其他的看看他们对于你有什么样的要求,你就奔着这个方向去努力即可。其次要多考证书如你学习算法那你完全可以去考软考软件设计师这个证书,对你来讲他其中很多知识都是你所学的。最后的最后,祝各位同学比赛一切顺利,得到属于自己满意的成绩,未来更加美好。
相关知识学习链接:
1.代码随想录 (代码随想录)
2.洛谷(题目列表 - 洛谷)
3.力扣(力扣 (LeetCode) 全球极客挚爱的技术成长平台)
4.oi-wiki(https://oi-wiki.org/)
相关大赛链接:
- icpc The ICPC International Collegiate Programming Contest
- ccpc 中国大学生程序设计竞赛(CCPC)-官网
- 蓝桥杯 连接高校和企业 - 蓝桥云课
- 码题杯 码蹄集
- 百度之星 https://star.baidu.com/#/
赛制部分内容节选自OI Wiki上的赛制介绍