分享我在编程比赛中获得金牌的经验和经历

下面这张图是我在美国计算机奥林匹克竞赛中获得的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://kuaibao.qq.com/s/20190419A0KPCQ00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券