练习
Darren Yao
要在竞赛编程中达到较高水平,需要投入和动力。许多人的练习效率不高,是因为他们所做的题目太简单、太困难,或者类型根本不合适。
在较低组别中,大多数题目使用的算法都相对基础;主要难点在于判断该用哪种算法,并正确实现它。比赛时,你应当把大部分时间用于思考题目和设计算法,而不是敲代码。因此,你需要练习实现能力,以便在比赛中快速、正确地实现算法,而不必依赖调试。
练习题应具有合适的难度。你不一定要完成每个模块末尾的全部练习,只需选择适合自己的题目。难度合适的题目通常属于以下两类之一:要么你经过一段时间的努力后想出了可行解法,要么你只差一点,需要查看题解中的少量内容。如果你立刻就能想到解法,这道题可能太简单;如果你缺失了多个关键步骤,它可能又太难。
补充资料
| Resources | |||||
|---|---|---|---|---|---|
| Aryansh | |||||
| CF | 介绍如何将 Codeforces 评分从 1000 提升到 2000 | ||||
阅读题解
判断何时该对一道题“放弃”并开始阅读题解(或分析)并不容易。这里给“放弃”加上引号,是因为即使“放弃”并阅读题解,你仍然能有所收获!下面是几位选手的看法。
Darren Yao
总体来说,我认为较早阅读题解并无不妥,前提是你已经尝试了几种不同思路,并且能从题解中有效学习。
- 对于青铜组题目,如果 15~20 分钟仍没有实质性进展,并且已经尝试了能想到的所有思路,就阅读题解。
- 对于白银组题目,如果 30~40 分钟仍没有实质性进展,就阅读题解。
- 我认为,卡住并查看题解时,不应该一次把整篇题解读完,更不应立刻查看题解代码。更好的做法是逐步阅读,直到找到突破口;这时应回到题目,自行完成并实现解法。阅读完整题解或代码应当作为最后的手段。
Nathan Wang
我个人认为,做竞赛编程题时较早放弃也没关系。有时我只花 15~20 分钟就会阅读题解,或者至少扫一眼题解代码;有时我也会花上长得多的时间。
竞赛编程题解通常并不是特别好懂(USACO 题解除外,它们写得相当不错),所以即使已经“放弃”并开始阅读题解,我往往仍要花很多时间理解解法。我认为,只要最终能够在不打开题解的情况下实现代码,就已经足够。
我认为可以这么早放弃,理由如下:
- 因挫败而一周不再练竞赛编程,比放弃一道题更糟糕。
- 每当我真的因为一道题感到沮丧时,我就会阅读题解。
- 竞赛编程题解往往很难理解,所以你仍然需要投入大量时间阅读和消化。
- 阅读题解能让你学到_很多_东西。
- 如果不读题解也能做出一道题,说明你在比赛中大概也能解决它,因此实际上没有学到太多新东西。相反,如果你原本不会做,却通过阅读题解学会了,那么收获就大得多。
- 换句话说,阅读题解是件_好事_,不是坏事!
总之,无论是在五小时后还是十五分钟后,当你觉得想“放弃”时,就放弃吧 :)
Benjamin Qi
如果你仍在不断产生新想法,就继续思考。否则,可以尝试以下几种方式自行摆脱卡顿:
- 查看标签(如果有)。
- 阅读官方题解的一部分。
- 阅读其他人的题解代码(如果已公开)。
- 即使你已经独立做出题目,这通常也很有帮助,因为顶尖选手有时会找到比官方题解更简洁的做法。
- 暂时放下题目,花几小时或几天做些别的事情(如果你想完全独立解决它)。这期间你常常会产生新的思路。
无论如何,如果你在比赛中已经对一道题思考了很久,却最终没能解决,那么题解发布后,我看不出有什么理由不去阅读(而要继续独自思考)。此外,除非你已经完全理解解法,否则之后都应亲自实现一遍。
更多信息也可以查看我的 GitHub 和我的 IOI 访谈。
Siyong Huang
通过解决一道题获得成长有两种方式:
1——从中学到新的思路或算法
你能从不会做的题目中学到新思路。这意味着你_需要_阅读题解或其他人的通过代码。首先一定要尝试理解题解;这是很重要的能力。足够困难的概念或思路需要反复阅读,并画出各种例子。如果这样仍然不奏效,就需要阅读其他解法或向别人求助。
尽管阅读他人的代码很困难,但我发现这是一项非常有用的能力。如果你的代码只是稍稍超时,可以看看更快的通过代码,从中寻找优化方法。另外,虽然情况不多,但有时会有另一种更快、更短的解法胜过题解中的解法。我主要就是通过阅读通过记录发现这些做法的。
寻求帮助时,务必指出究竟是哪一个思路让你困惑。笼统的问题最终往往只能得到对题解的复述——这并没有多大帮助。
最后,我个人认为提示的作用被高估了。直接阅读完整题解即可。读完部分解法后再自行补完,并不会带来额外收获。只要最终亲手实现,你学到的东西仍然相同。
2——提高实现速度和稳定性
最好的方法是大量解决简单或中等难度的题目。尽可能快地完成它们,就像真的在比赛中一样。你可以参加虚拟比赛,也可以在做题时自行计时。无论选择哪种方式,做的题越多,能力就会越强。
Nathan Chen
当你感觉自己不再取得进展时,就阅读题解;这个时间可能是一小时,也可能是五小时。不过,阅读题解最重要的部分,是理解其中的主题,并思考类似题目会是什么样子。保持广泛的好奇心,是练习算法思维的好方法。
William Lin
我遵循三条准则(按重要程度从高到低排列):
- 享受过程,做任何自己想做的事情。
- 花费与正式比赛中所能投入的大致相同的时间。
- 判断自己是否仍在取得进展。
Eric Wei
我认为练习最重要的一点,是尝试从每道题中获得一些东西:可能是一种新算法或新思路,可能是以后能派上用场的实现技巧,也可能只是一个希望自己今后不再犯的错误。话虽如此,在你卡住一段时间后,题解会更有帮助;我认为,稍微卡住时进行的探索往往很有启发性(这也是很好的比赛练习,因为比赛时你只能靠自己探索)。但到了某个时刻,题目带来的沮丧会多于帮助;在此之前不久,大概就是获取提示或阅读题解的合适时机。
Michael Cao
多做难题,并尝试从中学到东西。如果阅读了题解,就想一想:假如再做一次,你要怎样才能推导出这个解法。此外,把每道读过题解的题都亲手实现非常重要。最重要的是,不要把自己耗尽,否则最终只会适得其反,因为你的练习将不再高效。