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

图片

我正在为Google HashCode 2017世界杯决赛做准备,这是Google组织的最大的算法问题竞赛。

我从九年级开始从零开始学习C ++。 我对编程,算法和数据结构一无所知。 在某个时候,我写了第一行代码。 七个月后,正在筹备中的奥运会即将到来。 我想知道我的学习编程风格如何运作。 这是一个理想的机会。

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

我感到震惊。 我凭借5年的经验领先于竞争对手。 我知道我努力工作,但是这项成就超出了我的所有期望。 我意识到体育编程是我的主题,并一头扎进去。

我知道是什么导致我成功,并希望与您分享。

EDISON软件-网络开发
本文是在EDISON Software的支持下翻译的,EDISON Software 照顾了程序员的健康和早餐 ,并开发了定制软件 。


选择哪种编程语言


  • C ++-强烈推荐! 他非常快。 由于采用了STL,算法的实现只需很少的时间。 所有比赛都接受C ++。 我用C ++写了第一行代码。
  • C-由于STL而学习C ++。 如果您了解C,也可以使用C ++进行编程。
  • Java是一种慢速编程语言。 它有一个Big Integer类,但是并不能真正帮助您。 如果比赛有时间限制,那么您可能会使用Java超过它。 并非所有竞赛都接受Java。


你在哪里可以练习


我推荐Sphere Online Judge(SPOJ) 。 就数量和质量而言,它是一种有效的资源。 如果您陷于解决问题的过程中,可以在线获得编辑器和解决方案。 除了此站点之外,我还建议使用SPOJ工具包和SPOJ.pl 的问题分类器。

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


一旦习惯了该语言的语法,就必须解决一些问题。 从需要练习的简单问题开始。 在此阶段,最主要的是确定您的编程风格。 也许您喜欢编写带有很多空格的代码,也许不是。 也许将括号与“ if”放在同一行,也可以将其放在单独的行上。

您必须找到自己的编程风格,因为它是您的风格。

在寻找他时,请不要忘记两个基本原则:

  • 您的代码应该易于实现。 您应该轻松实施您想出的解决方案。 怎么了 因为在比赛中,您想要做的最后一件事就是迷失代码。 考虑如何简化代码的实现总是比花10分钟解决它更好。
  • 您的代码应易于阅读。 当代码易于阅读时,很容易调试。 面对现实-错误不断出现。 您是否知道当离开终点只有10分钟而找不到该死的错误时的感觉? 当然知道 为避免这种情况,请编写清晰的代码。 当您开始调试它时,代码看起来很自然并且易于理解。


这是我的编程风格的示例 。

如何提高您的开发技能


再练习,再练习。 我建议您完成SPOJ上最解决的前250个任务。 按顺序解决它们。 至少花一个小时来思考每个解决方案。

不要说:“这个问题对我来说太复杂了,我将尝试解决以下问题。” 所以失败者认为。

拿一张纸和一支铅笔。 想一想。 也许您可以找到解决方案,也许没有。 至少,您将发展算法思维。 如果您在一小时内无法提出解决方案,请在论坛或文章中查找现成的解决方案。

您将用这种方法实现什么? 了解如何通过代码快速实现您的想法。 并学习经典的问题和算法。

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


遵循分层方法。 您是否开始不走路跑步? 不行 您能在没有坚实基础的情况下建造摩天大楼吗? 再没有。

您不能忽略学习路径中的步骤。 如果您忽略它们,您仍然会存在知识空白。 随着时间的流逝,它们只会恶化。

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


很难上手。 也许是因为您不知道先学什么。 因此, 我创建了一个视频课程“算法和数据结构”。 在创建本课程时,我依靠了自己的教学方式。 反应令人难以置信! 第一个月,来自100多个国家/地区的3,000多名学生报名参加了该课程。

如果您致力于解决简单的问题,您将永远不会变得更好。

弄清您不知道的内容的最有效方法是在实践中遇到此问题。 所以我学习了。 我选择了一项艰巨的任务,学到了许多以前从未听说过的新技术。

您正在处理的每三个问题都应该教给您一些新知识。 选择问题时要小心。 选择问题比较困难!

在完成SPOJ的这250项任务之后,您将对体育编程的主要主题有一个共识。 由于对基本算法的逻辑有深入的了解,因此高级算法似乎不再那么复杂。 因此,您可以最大程度地利用自己的知识。

深入探讨每个主要主题。


这是一个有价值的资源,其中包含大量信息。 在那里,您将找到每个主题的十大算法和数据结构。 在SPOJ遇到250个问题之后,您将从此列表中了解很多。 但也偶然发现了许多以前从未听说过的东西。 因此,以升序开始探索这些主题。

如果您在学习新知识后不加强自己的知识,那么您会很快忘记一切。
我建议您在学习新算法后,在实践中使用它。 处理2-3个任务。 在SPOJ中查找算法标签。 在那里,您会发现需要该算法的解决方案的问题。 首先对这些问题进行排序。

处理动态编程,因为它将引导您走向胜利
根据我的经验,在每场比赛中至少存在一个动态编程问题。 许多人在听到“动态编程”一词时会头疼,因为他们根本听不懂。

那很好。 因为如果您了解动态编程,那么您将获胜。

我喜欢动态编程,这是我最喜欢的主题。 动态编程的秘诀是做出全局最优选择,而不仅仅是局部选择。 您必须将问题分解为更简单的子任务。 每个这些子任务仅解决一次。 然后创建一个解决方案,将已解决的子任务组合在一起。 贪婪算法与动态规划相反。 在其中,您需要在每个步骤中做出局部最优的选择。 局部最优的选择会导致较差的整体解决方案。

在探索新概念时,请查看TopCoder教程 。 它们非常详细且易于理解。 多亏了他们,我才得以理解二进制索引树 。

努力工作


您是否听说过没有多年实践就赢得奥运会冠军的运动员? 我不知道

每年9月开始进行计算机奥林匹克竞赛,四月结束。

在这8个月中,我每天练习5个小时。

是的,我只花了5个小时来解决算法问题。 我记得我练习8甚至10个小时的日子。 怎么了 因为我喜欢。 每天,放学回家,我直接去卧室,坐在电脑前,开始解决新问题。 或研究了解决该问题所需的新算法。

如果要赢,就必须这样做。 选择一个问题并坚持下去。 在去超市的路上或开车时考虑一下。

图片

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

这可以熟练地使用。 上床睡觉之前,阅读困难的问题并记住需要解决的问题。 此时,您不需要寻找解决方案本身。 上床睡觉 您的大脑将开始处理此问题。 当您醒来时,您会惊讶地发现自己在睡觉时找到了解决方案。

自己尝试。 看起来像魔术。

我创建了一个视频博客


图片

这段简短的段落与体育节目无关。 如果您超过20岁,并且对我如何看待世界感兴趣,那么您可以在Youtube上观看我的视频博客 。 我在其中谈到世界,生命和计算机科学。

明智地工作


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

我们是人,我们喜欢拖延 。 我们总是想推迟现在需要做的事情。 观看Netflix总是比处理动态节目问题更好。 您知道这一点,需要对其进行修复。

如何克服拖延症


为自己设定目标。 您将始终发现有趣的问题,可以从中学习新知识(查看我上面提到的资源)。 但是这些问题需要解决,而不仅仅是阅读它们。

因此,这就是我克服拖延症的方法。 我开始写纸质日历,每天都想解决我要解决的问题。 我总是提前两天提前填写问题。 因此,我知道接下来几天的时间安排。

图片

因此,我一直有动力。 我需要解决一些问题,并在日历的接下来几天找到新的问题。 消除已解决的问题非常好。 我知道你也喜欢

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

如何有效登场


想成为专业人士吗? 如果是这样,那么您需要在头脑中贬低。
这是迄今为止我所知道的最有效的调试技术,因为它根本不需要调试器。 与传统的调试器相比,您的大脑可以同时检查多个代码分支,并为您提供更广泛的代码概览。

您可以将自己与下棋并认为3步领先的大师进行比较。

我仅将此技术用作防御的起点。 然后,我使用一个真正的调试器。

为了学习如何在头脑中贬低,需要实践。 当您批准问题的解决方案并得到“错误答案”时,请勿直接进入调试器按钮。 重新阅读代码,然后思考:“这行会发生什么?”,“如果”会影响程序,那会怎样?”,“退出循环时,迭代器的值是什么?”。

所以你在想自己。 随着时间的流逝,您将学习如何编写代码并在旅途中首次展示它。

关于作者

图片
Andrei Margeloiu是一位狂热的程序员,对企业家精神,创业公司和自然界感兴趣。 您可以通过LinkedIn与他联系。

翻译:戴安娜·谢列米诺娃(Diana Sheremyova)


另请阅读博客
EDISON公司:


20个图书馆
壮观的iOS应用程序

Source: https://habr.com/ru/post/zh-CN473590/


All Articles