ACM金牌学长,算法竞赛经验分享
大家好,我是编程熊。不少读者问我: 本科打算法竞赛,你如何训练的呀?有什么经验么?于是小熊写一篇ACM算法竞赛入门和进阶指南,分享一下经验和学习方法。也许你可能不参加算法竞赛,但知道厉害的...
大家好,我是编程熊。
不少读者问我: 本科打算法竞赛,你如何训练的呀?有什么经验么?
于是小熊写一篇ACM算法竞赛入门和进阶指南,分享一下经验和学习方法。
也许你可能不参加算法竞赛,但知道厉害的人如何学习、训练、一步步变强,也是可以借鉴和学习的。
如果有一天你根据这个指南训练,拿了大厂offer、ACM奖牌,记得和小熊来说一声,哈哈。
文章目录如下,将从以下八个方面展开,接下来进入正文。
一、ACM竞赛
ACM程序设计竞赛是三人组队赛,一场比赛5个小时,通常有10~13个问题,三人合力解决,比赛时三人只能使用一台电脑。
每年有多个赛站,但每人一年只能参加两场区域赛(不算邀请赛、省赛)。
二、入门方式
主要从学习路径,即学习内容的先后顺序,进行介绍,后面会有学习资料推荐。
1)C语言的基本语法
2)简单语法题
3)基本算法和数据结构
4)进阶的算法以及复杂数据结构
5)....
由于本文主要是概括性的,详细的入门方式,如果大家需要(文末点赞和在看数量多的话),也会单出一篇文章分享。
三、书籍推荐
1、《挑战程序设计竞赛 第2版》
作者巫泽俊,是ACM-ICPC世界总决赛冠军。
个人感觉比下面的《算法竞赛入门经典-第2版》好入门一点,可能是因为图解多一点吧。
2、《算法竞赛入门经典-第2版》
竞赛选手常称,紫书。
我认识的竞赛选手大多都看过紫书,很多厉害的选手,刷了很多上面的习题。
3、《算法竞赛入门经典-训练指南》
配合紫书食用,里面很多UVA的题目,有的题目比较难。
四、算法博客
OI Wiki
OI Wiki 致力于成为一个免费开放且持续更新的 编程竞赛 (competitive programming) 知识整合站点,大家可以在这里获取与竞赛相关的、有趣又实用的知识。我们为大家准备了竞赛中的基础知识、常见题型、解题思路以及常用工具等内容,帮助大家更快速深入地学习编程竞赛中涉及到的知识。(来源于: OI Wiki)
五、刷题网站
1、Codeforces
世界上最大的刷题网站,每隔几天就会有一场比赛,参加人数非常多。
有两个场 div1 和 div2,div1 比 div2难。
一般比赛时间对国内选手不太友好,如果不能实时参加,也可以VP模拟。
同时因为每周都有几场比赛,网站积攒了大量的题目,也是一个巨大的题库。
cf 的 rating 系统可以作为训练、刷题效果的一个测试参考,但和考试一样,某一次的考试结果可能不太有参考意义。
来自某算法竞赛狂热爱好者的补充。
刚开始入门的时候我觉得我是一个人在沙漠里走,手里虽然拿着地图,但身边 缺乏参照物。 接触到 cf 以后,看着自己涨涨跌跌跌跌的 rating,看着五颜六色的国旗感觉还挺有游戏体验的。
2、HDU/POJ/ZOJ
学校的OJ,我大一入学的时候刷的是杭电11页里面的100题,练习的C++语法。
HDU和POJ、ZOJ一样里面也有大量的经典题。
3、Atcoder
日本的刷题网站,平常也有比赛,但频率没有Codeforces高,里面题目质量也很高。
4、Virtual Judge
这个网站是一个OJ网站合集,大家可以在VJ做其他OJ的题目,并提交。
六、团队分工
1、基础的算法与数据结构知识点
三个人都要会。
比如常见的,递归、二分、哈希、深度优先搜索、广度优先搜索、贪心、KMP、字典树、基础动态规划、基础数论等等。
基础的算法与数据结构知识点,三个人都会的话,这样可以在比赛中,谁看到了这种题都可以去写,不用耽误时间给其他队友讲解题意。
2、高阶的知识点
可以进行分工。三个人根据兴趣和擅长点,选择一部分进行攻坚,进行深入的学习。
比如:AC自动机、复杂的dp
(如插头dp
)、网络流、复杂数论...
我的个人建议是,一个高阶难的知识点,一个队伍至少有两个人掌握,这样比赛的时候,可以互相提供思路、帮忙debug。
七、组队训练
1、题目选择
可以选取以往的区域赛题目,在 Codeforces 的 GYM 中有很多国内和其他地区的区域赛题目。
下面提供如何选择一套题的方法,仅供参考。
找到一场比赛,在 common standing 中看看有没有国内的厉害的队伍 vp 过,可以作为选取的因素之一。
2、训练频率
不同水平队伍的不太一样。
目标是金牌的队伍,建议每周3~4次,考试周前除外。
大家可以根据队员时间合理安排。
3、赛前加练
赛前找一套题,三个人像比赛一样,用一台电脑训练。
题目不用找太难的,太难的会搞队伍心态。
目的是保持竞技状态。
4、赛后总结
赛后一定要总结,训练赛的目的发现问题。
问题包括但不限于:
知识点
做对的题,解决是不是最优的。
做错的题,什么case没考虑到,还是解决有问题,...
不会做的题,是所用的知识点没学过,还是没想到,...
团队合作
开题策略
合理「换线」
心态管理
5、赛后补题
赛后要将 做错的题、不会做的题,力所能及地进行补题。
对于不会做的题,努力走出舒适圈,去补题做那种稍微有点思路,但是没做出来的题。
三个人可以商量,分别补哪些题,合理分工。
最后可以将题解汇总到一个地方,可以复习,队伍其他人也可以学习一下。
PS: 之前有 ICPCCamp Wiki 大家可以参考强队的训练,赛后总结、题解、赛后补题。现在已经没了。
八、比赛策略
1、前中期
尽量保证每道题都有人读过题,最好每道题有2个人知道题意。
基本上跟住榜就行了。
那种榜上零零散散有队伍过的题目,可以尝试非常规思路。
2、封榜之后
封榜之后,如果卡着2-3题,必须做出取舍,最多保留2题,最好1题。
封榜之后一切以求稳为第一要义。(适用于绝大多数金银铜队伍)
3、无题可做的局面
如果目前没有一道题会做,可以考虑2+1的模式,一个人逐个浏览题目,看看有没有有思路的。另外两个人集中讨论思考同一道题。
4、因地制宜
重要的是,根据自己队伍的情况,总结一些规律和经验,就是什么样的策略比较适合自己队伍的情况。
比如。
自己队伍哪些知识点比较强,可以考虑优先做对应的题目。
每个人擅长什么题。
什么样的题适合放到前期、什么样的题适合放到后期。
5、什么样的情况下是策略有问题
当一个队伍感觉每场比赛 要是再多一个小时,自己就能多出1-2题的时候,就有可能是比赛策略有问题。
如果要是感觉自己再多一个小时,还是一样的结果,那就不是策略的问题。
最后,一切的比赛策略要建立在实力的基础上,实力不足,谈策略没有任何意义。
希望我们知足上进不负野心,各自努力顶峰相见。
鼓励一下小熊吧↓↓↓
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)