我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

我当时正在准备2017年Google HashCode世界锦标赛决赛。这是Google组织的最大规模的算法问题竞赛。

我从九年级开始从头开始学习 C++。 我对编程、算法或数据结构一无所知。 在某个时候,我写了第一行代码。 七个月后,编程竞赛迫在眉睫。 我想看看我的编程学习方式效果如何。 这是一个绝佳的机会。

经过两天的比赛,结果出来了:我获得了金牌。

我很震惊。 我以 5 年的经验领先于竞争对手。 我知道我很努力,但这个成绩超出了我的预期。 我意识到体育节目是我的主题,并一头扎进去。

我知道是什么让我取得了成功,我想与大家分享。

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

这篇文章是在爱迪生软件的支持下翻译的,它 关心程序员的健康和早餐开发定制软件.

选择哪种编程语言

  • C++ - 强烈推荐! 他的速度非常快。 由于 STL,算法的实现只需要很少的时间。 所有比赛均接受 C++。 我用 C++ 编写了第一行代码。
  • C - 通过 STL 学习 C++。 如果您了解 C,您也可以使用 C++ 进行编程。
  • Java 是一种运行缓慢的编程语言。 它有一个 Big Integer 类,但对你没有多大帮助。 如果比赛有时间限制,使用 Java 你一定会超过它。 并非所有比赛都接受 Java。

哪里可以练习

我推荐 Sphere 在线裁判 (SPOJ)。 无论从数量还是质量上来说,它都是一种有效的资源。 如果您在解决问题的过程中遇到困难,可以在线获取编辑器和解决方案。 除了这个网站我还推荐 SPOJ 工具包 и SPOJ.pl 的问题分类器.

首先,你需要磨练基础知识

一旦您习惯了该语言的语法,就需要克服一些问题。 从需要练习的简单问题开始。 在这个阶段,最主要的是确定你的编程风格。 也许您喜欢编写带有大量空格的代码,也许您不喜欢。 您可以将括号与“if”放在同一行,也可以将它们放在不同的行。

你必须找到你的编程风格,因为这是你的风格。

当您寻找它时,请记住两个基本原则:

  • 您的代码应该易于实现。 您应该能够轻松地实施您提出的解决方案。 为什么? 因为在比赛期间,您最不想看到的就是迷失在代码中。 多花 5 分钟思考如何简化代码的实现总是比花 10 分钟试图弄清楚要好。
  • 您的代码应该易于阅读。 当代码易于阅读时,调试也很容易。 让我们面对现实吧——错误总是会发生。 你知道当你还剩 10 分钟却找不到该死的错误时的感觉吗? 当然可以。 为了避免这种情况,请编写清晰的代码。 一旦开始调试,代码就会显得自然且易于理解。

这是我的一个例子 编程风格。

如何提高您的开发技能

练习,练习,再练习。 我建议您解决前 250 个最容易解决的问题 SPOJ。 按顺序解决它们。 至少花一个小时思考每个问题的解决方案。

不要说:“这个问题对我来说太难了,我会尽力解决下一个问题。” 这就是失败者的想法。

拿一张纸和一支铅笔。 想一想。 也许你能找到解决办法,也许不能。 至少,您将培养算法思维。 如果您无法在一小时内找到解决方案,请在论坛或文章中寻找现成的解决方案。

通过这种方法你会取得什么成果? 学习使用代码快速实现您的想法。 并研究经典问题和算法。

其次,你必须掌握算法和数据结构

遵循分层方法。 您是否在不知道如何走路的情况下开始跑步? 不。 没有坚实的地基,你能建造一座摩天大楼吗? 不会再有。

您不能忽视学习路径上的步骤。 如果你忽视它们,你就会留下知识空白。 随着时间的推移,它们只会变得更糟。

从基本算法和数据结构开始

很难开始。 也许是因为你不知道先学什么。 这就是为什么 我创建了一个视频课程“算法和数据结构”。 在创建这门课程时,我基于我想要的教学方式。 反应令人难以置信! 第一个月就有来自 3000 多个国家的 100 多名学生报名参加该课程。

如果你致力于解决简单的问题,你永远不会进步。

了解未知事物的最有效方法就是在实践中体验它。 我就是这样学习的。 通过选择一项具有挑战性的任务,我学到了许多以前从未听说过的新技术。

你每解决三个问题就应该教会你一些新东西。 选择问题时要更加小心。 选择更难的问题!

一旦您完成了 SPOJ 的这 250 个问题,您将对体育编程的核心主题有一个基本的了解。 深入理解基本算法背后的逻辑,高级算法就会显得不那么复杂。 这样你就可以充分利用你的知识。

深入挖掘每个主题

这是一个宝贵的资源 有很多信息。 在那里您可以找到每个主题的前 10 名算法和数据结构。 看完 SPOJ 的 250 个问题后,您将从这个列表中了解很多。 但你也会偶然发现许多你以前从未听说过的事情。 因此,开始按升序研究这些主题。

如果你在学习新东西后不加强知识,你很快就会忘记一切。
我建议你学习一种新算法后,在实践中使用它。 完成 2-3 个任务。 在 SPOJ 中查找算法标签。 在那里你会发现需要这个算法来解决的问题。 首先解决这些问题。

掌握动态规划,因为它将带您走向胜利
根据我的经验,每场比赛都至少有一个问题 动态规划。 很多人一听到“动态规划”这个词就头疼,因为根本不理解。

这很好。 因为如果你了解动态规划,那么你就会赢。

我喜欢动态规划,这是我最喜欢的主题。 动态规划的秘诀是做出全局最优选择,而不仅仅是局部最优选择。 您必须将问题分解为更简单的子问题。 每个子问题仅解决一次。 然后创建一个结合已解决的子问题的解决方案。 贪心算法 - 与动态规划相反。 它需要在每一步中做出局部最优选择。 局部最优选择可能会导致糟糕的全局解决方案。

在学习新概念的同时,请查看 TopCoder 教程。 它们非常详细且易于理解。 感谢他们我能够理解 二叉索引树.

努力工作

你听说过没有经过多年训练就能赢得奥运会冠军的运动员吗? 我没有。

每年,计算机奥林匹克竞赛的准备工作从九月开始,到四月结束。

这8个月里我每天练习5个小时。

是的,我花了这 5 个小时只解决算法问题。 我记得那些日子我练习了8个小时甚至10个小时。 为什么? 因为我喜欢它。 每天放学回家,我都会直奔卧室,坐在电脑前,开始分析新问题。 或者我正在学习一种新的算法,我需要知道它来解决这个问题。

如果你想赢,你也必须这样做。 选择一个问题并坚持下去。 在步行去超市或开车时想一想。

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

您是否知道,当您睡觉时,您的大脑会对当天收集的信息进行碎片整理? 他似乎正在按字母顺序将书籍堆放在书架上。 本质上,你的大脑会思考你面临的各种问题。

这个可以熟练运用。 睡觉前,阅读一道难题并记住如何解决它。 在此阶段,您不需要寻找解决方案本身。 睡觉。 你的大脑将开始处理这个问题。 当你醒来时,你会惊讶地发现你在睡梦中找到了解决方案。

自己尝试一下。 这就像魔法一样。

我创建了一个视频博客

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

这段短文与体育节目无关。 如果你二十多岁,想知道我如何看待这个世界,你可能想看看 我在 YouTube 上的视频博客。 我在里面讲世界,讲人生,讲计算机科学。

聪明地工作

这就是成功的秘诀。 你需要目标。

我们是人,我们喜欢它 拖延。 我们总是想推迟现在需要做的事情。 看Netflix总是比处理动态规划问题更有趣。 你知道这一点并且需要解决它。

如何战胜拖延症

给自己设定目标。 你总会发现有趣的问题,从中你可以学到新的东西(查看我上面提到的资源)。 但这些问题需要解决,而不仅仅是阅读。

这就是我克服拖延症的方法。 我开始制作纸质日历,每天都写满我想解决的问题。 我总是提前两天填写问题。 所以我知道如何管理接下来几天的时间。

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚

所以我总是充满动力。 我需要解决一些问题并找到新的问题来填补日历上接下来的日子。 划掉已解决的问题感觉很棒。 我知道你也喜欢它。

获取您自己的纸质日历。 不要在手机上创建另一个您明天就会忘记的待办事项列表。

如何有效调试

你想成为一名专业人士吗? 如果是的话,那么你需要“在心里调试一下”。
这是迄今为止我所知道的最有效的调试技术,因为它根本不需要调试器。 与其他代码相比,您的大脑会同时检查多个代码分支,并为您提供更广泛的代码概览 经典调试器.

你可以把自己比作一位下棋的大师,他会提前思考 3 步。

我仅使用此技术作为我的初始防线。 然后我使用真正的调试器。

要学习如何在头脑中进行调试,您需要练习。 当您验证问题的解决方案并得到“错误答案”时,不要直接转到调试器按钮。 重新阅读代码并思考:“这一行发生了什么?”、“这里的“if”对程序有何影响?”、“当我们退出循环时,迭代器的值是多少?”

这样你就可以自己思考了。 随着时间的推移,您将学习编写代码并即时调试。

关于作者

我如何在计算机奥林匹克竞赛中赢得 3 枚金牌中的 4 枚
Andrei Margeloiu 是一位狂热的程序员,对创业、初创公司和户外活动感兴趣。 你可以联系他 在领英上.

翻译:戴安娜·谢列米耶娃

来源: habr.com

添加评论