我如何在计算机奥林匹克竞赛上赢得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