许多人以某种有组织的方式进行练习。高中每周六组织IOI/OI训练竞赛,大学每周举办ICPC训练竞赛,个人则尝试每天解决三个问题,网站也会举办比赛等。这里有个秘密:这其实没什么用。没错,是真的。如果你想真正变得优秀,参加每周一次的训练,只是为了在看不到进步时找借口说“我训练得很努力”。每个优秀的人都为编程竞赛付出了相当一部分的生活,而我所说的不是放弃周六的聚会或失去朋友,而是心灵深处的投入。你必须真正想要进步,并享受练习和观察自己进步的过程。这还意味着你要在生活的各个方面捕捉到算法的意义。
你应该在每次有“哦,我想解决某个问题”、“哦,现在练习一下也不错”或“哦,想解决这个网站上的每个问题,开始吧”的想法时进行练习。如果你真的想变得优秀,你会有很多这样的想法。如果你没有这些想法,单单想每周练习,那么不如反思一下自己是否真的想变得更好。你觉得自己在组合数学上不好?很好,你意识到自己的弱点,那就去解决一些相关的问题。想解决几个问题?太好了,解决那些对你来说有挑战性的问题。或者想从某个题库中解决所有问题(仍然可能是个挑战)。或者想全力以赴解决一个轮次的所有问题(这仍然可能是个挑战)。或者想在Codeforces上解决比你的朋友更多的问题(这仍然可能是个挑战)。无论因为什么原因,但仍然不要解决Codeforces上最简单的问题并期待自己变得优秀。
想参加一次虚拟比赛?当然可以,但不要在你确定能够解决它们的情况下去做。做这件事是为了检验自己是否能赢得比赛、比朋友更好等。记住,挑战很重要!当然,如果你已经相当强,想阅读(或甚至参与)难度低于你水平的div3问题也是可以的——这表明你对问题感到好奇并且有兴趣。
你真的想变得更强,并在两场5小时的虚拟比赛中进行竞争吗?太好了,那就去练习。想参加大学组织的训练?当然,绝佳主意——竞争、压力、与他人一起的乐趣。如果你真的在练习并努力提高,和同学/大学/队友的每周训练会变成一次愉快的活动,但不要依赖它们。
此外,和你的ACM团队一起练习也是提升团队能力的好方法——你需要了解自己的优缺点,学会合作。为了让你的团队在解决问题时更强大,你必须先提升自己的能力。想跳过大学组织的训练,去见朋友、读书或玩游戏?当然可以,如果你不想练习,就不要强迫自己。如果你真的想练习并变得强大,你一定会在虚拟比赛中参与或其他方式去竞争,不要强迫自己,只要真正感受到练习的需要。艺术不能急于求成,对吧?
再说一次:你真的要把CP放在心上。在解决一个问题后,不意味着它就结束了,你必须忘记它。也许你会发现自己在思考某个任务的有趣方面,并想出一个更难的问题?我不知道还有什么要说的。不要放弃?如果你有正确的态度,即使你无法解决对你来说非常有趣/重要的问题,你会尝试几天——成功解决一个重要问题后,获得的愉悦和自我满足感是最棒的感觉之一。
最后一点建议:我在观察Codeforces/Atcoder的顶尖选手时发现,他们都不使用“问题”这个词来替代“任务”。所以不要这么做。如果你一直把问题称为“问题”,你就无法进步。所以,是的,这就是我的看法。让CP融入你的思维中,找到真正的练习欲望。不要试图强迫自己以有组织的方式进行练习。我知道这篇博客可能会让一些人感到沮丧,但他们不会在这样的态度下走得太远。我也认为它可以帮助那些有潜力的人,成为真正强大的人,这就是我写这篇文章的原因。如果任何其他顶级程序员想分享他们的方式或指出差异,那太好了。