Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

Eu estava me preparando para as finais do Campeonato Mundial Google HashCode 2017. Esta é a maior competição com problemas algorítmicos organizada pelo Google.

Comecei a aprender C++ do zero na nona série. Eu não sabia nada sobre programação, algoritmos ou estruturas de dados. Em algum momento escrevi minha primeira linha de código. Sete meses depois, a competição de programação surgiu no horizonte. Eu queria ver se meu estilo de aprender programação funcionava bem. Foi a oportunidade perfeita.

Depois de dois dias de competição, o resultado veio: conquistei a medalha de ouro.

Fiquei chocado. Fiquei à frente dos concorrentes com 5 anos de experiência. Eu sabia que tinha trabalhado muito, mas essa conquista superou todas as minhas expectativas. Percebi que a programação esportiva era o meu tema e mergulhei de cabeça nisso.

Eu sei o que me levou ao sucesso e quero compartilhar isso com você.

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

O artigo foi traduzido com o apoio da EDISON Software, que cuida da saúde dos programadores e do seu café da manhãE desenvolve software personalizado.

Qual linguagem de programação escolher

  • C++ - Altamente recomendado! Ele é muito rápido. A implementação de algoritmos leva pouco tempo devido ao STL. C++ é aceito em todas as competições. Escrevi minha primeira linha de código em C++.
  • C - Aprenda C++ por causa do STL. Se você conhece C, também pode programar em C++.
  • Java é uma linguagem de programação lenta. Tem uma classe Big Integer, mas não vai te ajudar muito. Se uma competição tem limite de tempo, com Java você certamente irá ultrapassá-lo. Java não é aceito em todas as competições.

Onde você pode praticar

Eu recomendo Juiz Online da Esfera (SPOJ). É um recurso eficaz em termos de quantidade e qualidade. Editores e soluções estão disponíveis online se você ficar preso no processo de resolução de problemas. Além deste site eu recomendo Kit de ferramentas SPOJ и classificador de problemas para SPOJ.pl.

Primeiro, você precisa aprimorar seu conhecimento do básico

Depois de se acostumar com a sintaxe da linguagem, existem alguns problemas a serem superados. Comece com problemas simples que requerem prática. Nesta fase, o principal é determinar o seu estilo de programação. Talvez você goste de escrever código com muitos espaços em branco, talvez não. Você pode colocar os parênteses na mesma linha do “se” ou em linhas separadas.

Você tem que encontrar o seu estilo de programação porque é o SEU estilo.

Ao procurar por isso, lembre-se de dois princípios básicos:

  • Seu código deve ser fácil de implementar. Você deve se sentir confortável para implementar a solução que encontrar. Por que? Porque durante uma competição, a última coisa que você quer é se perder no seu código. É sempre melhor gastar 5 minutos extras pensando em como simplificar a implementação do código do que gastar 10 minutos tentando descobrir.
  • Seu código deve ser fácil de ler. Quando o código é fácil de ler, é fácil depurar. Vamos ser sinceros: bugs acontecem o tempo todo. Você conhece aquela sensação quando faltam 10 minutos e não consegue encontrar o maldito erro? Claro que você faz. Para evitar esta situação, escreva um código legível. Depois de começar a depurá-lo, o código parecerá natural e fácil de entender.

Aqui está um exemplo meu estilo de programação.

Como melhorar suas habilidades de desenvolvimento

Prática, prática e mais prática. Eu recomendo que você trabalhe nos primeiros 250 problemas mais solucionáveis SPJ. Resolva-os em ordem. Passe pelo menos uma hora pensando na solução para cada um deles.

Não diga: “Esse problema é muito difícil para mim, tentarei resolver o próximo”. É assim que os perdedores pensam.

Pegue um pedaço de papel e um lápis. Pense nisso. Talvez você consiga encontrar uma solução, talvez não. No mínimo, você desenvolverá o pensamento algorítmico. Se você não conseguir encontrar uma solução em uma hora, procure uma solução pronta no fórum ou em artigos.

O que você alcançará com essa abordagem? Aprenda a implementar rapidamente suas ideias usando código. E estude problemas e algoritmos clássicos.

Em segundo lugar, você deve dominar algoritmos e estruturas de dados

Siga uma abordagem hierárquica. Você começou a correr sem saber andar? Não. Você pode construir um arranha-céu sem uma base sólida? De novo não.

Você não pode ignorar as etapas do caminho de aprendizagem. Se você ignorá-los, ficará com lacunas de conhecimento. Com o tempo, eles só vão piorar.

Comece com algoritmos e estruturas de dados fundamentais

É difícil começar. Talvez porque você não saiba o que estudar primeiro. É por isso Criei um vídeo curso “Algoritmos e Estruturas de Dados”. Ao criar este curso, baseei-me em como gostaria de ser ensinado. A reação foi incrível! Mais de 3000 estudantes de mais de 100 países se inscreveram no curso no primeiro mês.

Se você trabalhar para resolver problemas fáceis, nunca melhorará.

A maneira mais eficaz de entender o que você não sabe é vivenciar na prática. Foi assim que aprendi. Aprendi muitas técnicas novas das quais nunca tinha ouvido falar antes, escolhendo uma tarefa desafiadora.

Cada terceiro problema em que você trabalha deve lhe ensinar algo novo. Tenha mais cuidado ao escolher os problemas. Escolha problemas mais difíceis!

Depois de concluir esses 250 problemas do SPOJ, você terá uma compreensão básica dos principais tópicos da programação esportiva. Com uma compreensão profunda da lógica por trás dos algoritmos básicos, os algoritmos de alto nível parecerão menos complexos. Dessa forma você poderá aproveitar ao máximo seu conhecimento.

Aprofunde-se em cada um dos temas principais

Aqui está um recurso valioso com muita informação. Lá você encontrará os 10 principais algoritmos e estruturas de dados para cada tópico. Após 250 problemas do SPOJ, você saberá muito desta lista. Mas você também encontrará muitas coisas das quais nunca ouviu falar antes. Então comece a estudar esses tópicos em ordem crescente.

Se você não fortalecer seu conhecimento depois de aprender algo novo, rapidamente esquecerá tudo.
Recomendo que depois de aprender um novo algoritmo, você o use na prática. Trabalhe em 2-3 tarefas. Procure a tag do algoritmo no SPOJ. Lá você encontrará problemas que precisam desse algoritmo para resolver. Aborde esses problemas primeiro.

Domine a programação dinâmica porque ela o levará à vitória
Pela minha experiência, toda competição tem pelo menos um problema programaçao dinamica. Muitas pessoas ficam com dor de cabeça ao ouvir a frase “programação dinâmica” porque não a entendem de jeito nenhum.

E isso é bom. Porque se você entende de programação dinâmica, você vencerá.

Gosto de programação dinâmica, é meu tema preferido. O segredo da programação dinâmica é fazer escolhas globalmente ótimas, e não apenas locais. Você deve dividir o problema em subproblemas mais simples. Resolva cada um desses subproblemas apenas uma vez. Em seguida, crie uma solução que combine os subproblemas resolvidos. Algoritmo ganancioso - o oposto da programação dinâmica. Requer fazer escolhas localmente ótimas em cada etapa. E uma escolha localmente óptima pode levar a uma má solução global.

Enquanto aprende novos conceitos, confira Tutoriais do TopCoder. Eles são muito detalhados e compreensíveis. Graças a eles pude entender árvores binárias indexadas.

Trabalhar duro

Você já ouviu falar de atletas que vencem as Olimpíadas sem anos de prática? Eu não.

Todos os anos, os preparativos para a Olimpíada de Informática começavam em setembro e terminavam em abril.

Todos os dias durante esses 8 meses pratiquei 5 horas.

E sim, passei essas 5 horas apenas resolvendo problemas algorítmicos. Lembro-me dos dias em que praticava 8 e até 10 horas. Por que? Porque eu gostei. Todos os dias, quando voltava da escola, ia direto para o quarto, sentava em frente ao computador e começava a analisar um novo problema. Ou eu estava aprendendo um novo algoritmo que precisava conhecer para resolver esse problema.

Se você quiser vencer, terá que fazer o mesmo. Escolha um problema e cumpra-o. Pense nisso enquanto caminha até o supermercado ou enquanto dirige.

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

Você sabia que quando você dorme, seu cérebro desfragmenta as informações coletadas naquele dia? Ele parece estar empilhando livros em ordem alfabética em uma estante. Essencialmente, seu cérebro pensa nos vários problemas que você está enfrentando.

Isso pode ser usado com habilidade. Antes de ir para a cama, leia um problema difícil e lembre-se do que é necessário para resolvê-lo. Nesta fase, você não precisa procurar a solução em si. Ir para a cama. Seu cérebro começará a processar esse problema. Ao acordar, você ficará surpreso ao perceber que encontrou a solução enquanto dormia.

Tente você mesmo. É como mágica.

Eu criei um videoblog

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

Este pequeno parágrafo não está relacionado à programação esportiva. Se você tem vinte e poucos anos e está se perguntando como vejo o mundo, talvez queira dar uma olhada meu videoblog no Youtube. Falo sobre o mundo, a vida e a ciência da computação nele.

Trabalho inteligente

Este é o segredo do sucesso. Você precisa de metas.

Somos pessoas e gostamos disso procrastinar. Sempre queremos adiar o que precisa ser feito agora. Assistir Netflix é sempre mais divertido do que lidar com problemas dinâmicos de programação. Você sabe disso e precisa consertar.

Como vencer a procrastinação

Estabeleça metas para si mesmo. Você sempre encontrará problemas interessantes com os quais poderá aprender algo novo (confira os recursos que mencionei acima). Mas esses problemas precisam ser resolvidos e não apenas lidos.

Então foi assim que superei a procrastinação. Comecei um calendário de papel e preenchi cada dia com problemas que queria resolver. Sempre preenchi os problemas com dois dias de antecedência. Então eu soube administrar meu tempo nos dias seguintes.

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad

Então eu estava sempre motivado. Precisava resolver alguns problemas e encontrar novos para preencher os próximos dias do calendário. Riscar problemas resolvidos é ótimo. Eu sei que você também gosta.

Obtenha seu próprio calendário de papel. Não crie outra lista de tarefas em seu telefone que você esquecerá amanhã.

Como depurar de forma eficaz

Você quer se tornar um profissional? Se sim, então você precisa “depurar em sua mente”.
Esta é de longe a técnica de depuração mais eficiente que conheço porque não requer nenhum depurador. Seu cérebro examina várias ramificações do código ao mesmo tempo e oferece uma visão geral muito mais ampla do código em comparação com depurador clássico.

Você pode se comparar a um grande mestre que joga xadrez e pensa três lances à frente.

Eu uso essa técnica apenas como minha linha inicial de defesa. Então eu uso um depurador real.

Para aprender a depurar mentalmente, você precisa praticar. Ao validar uma solução para um problema e obter uma “resposta errada”, não vá direto para o botão do depurador. Releia o código e pense: “O que está acontecendo nesta linha?”, “Como o “se” aqui afeta o programa?”, “Quando saímos do loop, qual é o valor do iterador?”

Dessa forma você pensa por si mesmo. Com o tempo, você aprenderá a escrever código e depurá-lo rapidamente.

Sobre o autor

Como ganhei 3 de 4 medalhas de ouro na Computing Olympiad
Andrei Margeloiu é um programador ávido com interesse em empreendedorismo, startups e atividades ao ar livre. Você pode contatá-lo no LinkedIn.

Tradução: Diana Sheremyeva

Fonte: habr.com

Adicionar um comentário