下面这张图是我在美国计算机奥林匹克竞赛中获得的3枚金牌
我在中学的第一年开始从零开始学习C ++。我对编程、算法或数据结构一无所知。在我写完第一行代码七个月后,计算机奥林匹克竞赛开始了。这是检验我的学习成绩的一个最佳时机。
经过2天的比赛,结果证明了一切:我赢得了金牌。
我其实还是有点震惊的,因为我已经超过了5年经验的竞争对手。我很清楚我的努力程度,但这个成就确实超出了我的预期。
因此,在这篇文章中我想分享一些成功经验给到大家。
你应该选择什么语言?
强烈推荐C ++!它非常快。由于STL,因此实现不同的算法花费的时间会很少。所有比赛都接受C ++。自从我写第一行代码以来,就一直在使用它。
C?还是去学习C ++吧,因为STL。如果您了解C,那么您也可以使用C ++编写代码。
JAVA?有点慢。如果比赛时间紧迫的话,您可能会超出时间限制。而且很多比赛都不接受Java。
你在哪里练习?
我推荐Sphere Online Judge(SPOJ)。它在质量和数量方面都很有效。如果您在解决问题时遇到困难,可以在线获取社论和解决方案。为SPOJ.pl支持网站SPOJ Toolkit和Problem分类器。
首先,你必须掌握基础知识
在习惯了语言的语法后,是时候解决一些问题了。从需要实施技能的简单任务开始。在此阶段,您的目标是定义您的编码风格。也许你喜欢写很多空格,也许不是,也许你习惯把括号放在与'if'语句相同的行上,也许不是。
你必须找到你的编码风格,烙上属于你的印记。
在开发编码风格时,请牢记这两个原则。
易于实施。您应该能够放心地实施您提出的解决方案。为什么?因为在竞争中,你最不希望发生的事情就是在代码中迷失。最好再多花5分钟考虑,而不是在执行时多花费10分钟来实现它。
易于阅读。这意味着“易于调试”。让我们面对现实,我们都知道bug会一直出现。可能当你还有十分钟的时候,你还是找不到所谓的bug,要解决这个问题,你必须编写清晰的代码。这样,当您开始调试时,代码会感觉自然而且易于理解。
这是我的编码风格。Just-to-share-code/Biconnected components at master · margiki/Just-to-share-code · GitHub
如何提高您的执行能力?
实践、实践和更多实践。我建议你在SPOJ上处理前250个最容易解决的问题。按照确切的顺序解决它们,并花至少一个小时来思考这个问题。
不要说'这个问题对我来说太难了'。这是失败者的心态。
拿一张纸和一支铅笔试着思考。通过这种方式,您可能会找到解决方案,说不定会开发算法思维。如果您在一小时内未找到解决方案,那么您可以查看论坛或社论来看看别人的解决方案作为参考。
这种方法的结果是什么?快速实施并学习到经典问题和算法。
其次,您必须掌握算法和数据结构
遵循分层方法。你不会在不知道如何走路的时候就开始跑步,也不会在没有坚实基础的情况下就建造摩天大楼。
这意味着您无法在学习路径中刻录步骤。或者说,如果你这样做了,那么你将继续增大随着时间的推移而加深的知识差距。
从基本算法和数据结构开始
其实这很难开始的,可能是因为你不知道该先学什么。这就是我创建算法和数据结构视频课程的原因,我按照我希望的方式完成了这门课程。得到的回应令人难以置信,来自100多个国家的3000多名学生在第一个月就加入了。
如果你永远轻松解决问题,那么你永远不会变得更好。
发现你不知道的东西的最有效的方法就是去面对它,这同时也是发生在我身上的事。通过选择一个难题,我学到了许多以前从未听说过的新技术。
从你解决的每3个问题中,你就会学到一些新的东西。如果没有,请更仔细地选择问题——选择更难的问题!
在完成SPOJ的250个问题之后,您将对竞争性编程的主要主题有一个概述。通过深入理解基本算法背后的逻辑,高级算法似乎就很容易理解了,这样就可以快速利用你已有的知识了。
现在深入研究每个主要话题
这是一个巨大的资源,每个主题都有十大算法和数据结构。在SPOJ的250个问题之后,您将从该列表中了解许多问题。但是仍有许多你从未听说过的,所以现在可以开始按升序学习它们。
如果你在学习新东西后没有增强知识,你就会忘记它。
我建议你在学习一种新的算法来练习2~3个可以使用到它的问题。在SPOJ上搜索算法的标签,你会发现一些需要用到它的问题。
理解动态编程因为它会是你获胜道路上的重要因素。
根据我的经验,每场比赛都至少有一个动态编程问题。许多人在听到DP时会头疼,因为他们不理解。
这是件好事。因为如果你真的了解DP,你就会赢。
我喜欢DP,这是我最喜欢的话题。这是DP的秘密:考虑全局最优,而不仅仅是局部最优。您必须将问题分解为更简单的子问题,只需解决一次,并构建组合这些已解决的子问题的解决方案。与DP相反的是贪婪算法,因为后者在每一步选择时都是局部最优。而局部最佳选择可能会导致糟糕的全局解决方案。
学习新概念时,请查看TopCoder教程。它们非常详细且易于理解。从那里我清楚了解二元索引树的概念。
努力工作
您是否听说过没有经过多年练习就赢得奥运会的运动员?我没有。
每年,计算机奥林匹克运动会的筹备工作都是于9月开始,于4月结束。
在这8个月的每一天,我每天都练习5个小时。
是的,我花了这5个小时解决算法问题。我记得我练习的时间甚至是8或10个小时。为什么?因为我对它充满热情。从学校回到家后的每一天,我都直接去了我的卧室开始解决一个新问题。编程比赛经验分享或者学习该问题所需的新算法。
如果你想赢,你必须这样做,解决问题并坚持下去,在前往超市的路上,或者开车的时候都可以想一想。
其实在我们睡觉的时候,大脑会对当天收集的信息进行碎片整理,就像是将书籍按字母的顺序放在书架上,基本上,大脑都可以处理你遇到的不同问题。
这里我讲一个利用到这一点的例子。在你入睡之前阅读一个难题并牢记它的要求。此时,您不必找到解决方案。然后你去睡觉,你的大脑机制会开始处理这个问题。当你醒来时,你会感到惊讶:因为你在睡觉时找到了解决方案。
亲自尝试一下,这感觉就像魔术一样。
聪明的工作
这是成功的秘诀,你需要一个目标。
我们是人类,喜欢拖延。这意味着会推迟你现在需要做的事情。
你如何战胜拖延症?
通过假设目标,你总能找到有趣的问题,从那里你可以学到一些新东西。但是这些问题必须解决,而不仅仅是停留在阅读的层面。
所以这就是我克服拖延的方法。我已经制作了纸质日历,并且每天都要填写我想要解决的问题。我总是提前两天填补问题,所以我知道如何在接下来的日子里管理我的时间。
通过这种方式,我总是有动力完成问题并找到新的问题来填补。在解决问题时削减问题是一种很有价值的感觉。
建议最好做成纸质的日历,因为如果是手机上的清单,那么很有可能明天你就忘了这回事儿。
如何有效调试?
你想成为职业选手吗?如果是这样,你需要“在脑海中调试”。
到目前为止,这是我所知道的最有效的调试技术,因为它根本不需要调试器。与经典调试器相比,您的大脑同时探索了多个代码路径,并为您提供了更广泛的代码视角。
这类似于大师们下棋提前考虑3个动作的能力。
我将此技术专门用作我的初始防线,然后在最后一个实例中使用实际的调试器。
要学会“在脑海里调试”,你需要练习。当您提交问题并收到“错误答案”时,请不要直接进入调试器按钮。相反,开始阅读代码并思考'这一行发生了什么?','这个'if'语句如何影响程序?','当它退出循环时,迭代器的值是多少?'。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjyfx/112.html