Como ganhei 3 de 4 medalhas de ouro na Olimpíada de Computação

imagem

Eu estava me preparando para a final da Copa do Mundo do Google HashCode 2017. Este é o maior concurso de problemas algorítmicos organizado pelo Google.

Comecei a aprender C ++ do zero na nona série. Eu não sabia nada sobre programação, algoritmos e estruturas de dados. Em algum momento, escrevi minha primeira linha de código. Sete meses depois, as Olimpíadas de programação surgiram no horizonte. Eu queria saber como funcionava meu estilo de aprender programação. Foi uma oportunidade ideal.

Após dois dias de competição, chegaram os resultados: ganhei uma medalha de ouro.

Eu estava em choque. Fiquei à frente dos concorrentes com 5 anos de experiência. Eu sabia que trabalhava duro, mas essa conquista excedeu todas as minhas expectativas. Percebi que a programação esportiva é o meu tópico e entrei nisso com a minha cabeça.

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

EDISON Software - desenvolvimento web
Este artigo foi traduzido com o suporte do software EDISON, que cuida da saúde dos programadores e do café da manhã e também desenvolve software personalizado .


Qual linguagem de programação escolher


  • C ++ - Altamente recomendado! Ele é muito rápido. A implementação dos algoritmos leva pouco tempo devido ao STL. C ++ é aceito em todas as competições. Eu escrevi minha primeira linha de código em C ++.
  • C - aprenda C ++ devido a STL. Se você conhece C, também pode programar em C ++.
  • Java é uma linguagem de programação lenta. Ele tem uma classe Inteiro Grande, mas não ajuda muito. Se a competição tiver um limite de tempo, você provavelmente o excederá com Java. Java não é aceito em todas as competições.


Onde você pode praticar


Eu recomendo o Sphere Online Judge (SPOJ) . É um recurso eficaz em termos de quantidade e qualidade. Editores e soluções estão disponíveis online, se você estiver preso no processo de solução de problemas. Além deste site, recomendo o SPOJ Toolkit e o classificador de problemas para o SPOJ.pl.

Primeiro, você precisa aprimorar o básico


Depois de se acostumar com a sintaxe do idioma, você terá que resolver alguns problemas. 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, ou talvez não. Talvez você coloque os colchetes na mesma linha que o "se" ou os coloque em linhas separadas.

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

Ao procurá-lo, não se esqueça de dois princípios básicos:

  • Seu código deve ser fácil de implementar. Você deve se sentir à vontade para implementar a solução que você criou. Porque Porque durante a competição, a última coisa que você quer é se perder no seu código. É sempre melhor pensar em como simplificar a implementação do código, do que gastar 10 minutos para descobrir.
  • Seu código deve ser fácil de ler. Quando o código é fácil de ler, é fácil depurar. Vamos ser sinceros - os erros aparecem constantemente. Você conhece a mesma sensação quando restam 10 minutos até o fim e não consegue encontrar o maldito erro? Claro que você sabe. Para evitar essa situação, escreva um código legível. Quando você começa a depurá-lo, o código parecerá natural e fácil de entender.


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

Como aprimorar suas habilidades de desenvolvimento


Pratique, pratique e pratique novamente. Eu recomendo que você trabalhe nas primeiras 250 das tarefas mais resolvidas no SPOJ . Resolva-os em ordem. Reserve pelo menos uma hora para refletir sobre as soluções para cada um deles.

Não diga: "Este problema é muito complicado para mim, tentarei resolver o seguinte." Então os perdedores pensam.

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

O que você alcançará com essa abordagem? Aprenda a implementar rapidamente suas idéias com código. E aprenda problemas e algoritmos clássicos.

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


Siga uma abordagem hierárquica. Você começou a correr sem 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 no caminho de aprendizado. Se você ignorá-los, ainda terá 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 curso em vídeo "Algoritmos e estruturas de dados". Ao criar este curso, contei como gostaria de ser ensinado. A reação foi incrível! Mais de 3.000 estudantes de mais de 100 países se inscreveram no curso no primeiro mês.

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

A maneira mais eficaz de descobrir o que você não sabe é se deparar com isso na prática. Então eu estudei. Aprendi muitas técnicas novas das quais nunca tinha ouvido falar antes, escolhendo uma tarefa difícil.

Todo terceiro problema em que você está trabalhando deve lhe ensinar algo novo. Tenha cuidado ao escolher um problema. Escolha problemas mais difíceis!

Depois de concluir essas 250 tarefas do SPOJ, você terá um entendimento comum dos principais tópicos da programação esportiva. Graças a um profundo entendimento da lógica subjacente aos algoritmos básicos, os algoritmos de alto nível parecerão menos complicados. Assim, você pode usar seu conhecimento ao máximo.

Aprofundar cada um dos tópicos 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 também tropeçar em coisas que nunca foram ouvidas antes. Portanto, comece a explorar esses tópicos em ordem crescente.

Se você não fortalecer seu conhecimento depois de aprender algo novo, rapidamente esquecerá tudo.
Eu recomendo que depois de aprender o novo algoritmo, use-o na prática. Trabalhe em 2-3 tarefas. Procure a tag do algoritmo no SPOJ. Lá você encontrará problemas para a solução da qual esse algoritmo é necessário. Classifique esses problemas primeiro.

Lide com a programação dinâmica porque ela o levará à vitória
Com base na minha experiência, em todas as competições há pelo menos um problema de programação dinâmica . Muitas pessoas têm dor de cabeça quando ouvem a frase "programação dinâmica" porque não a entendem.

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

Eu gosto de programação dinâmica, este é o meu tópico favorito. O segredo da programação dinâmica é fazer escolhas globalmente ótimas, não apenas locais. Você deve dividir o problema em subtarefas mais simples. Resolva cada uma dessas subtarefas apenas uma vez. Em seguida, crie uma solução que combine as subtarefas resolvidas. Um algoritmo ganancioso é o oposto da programação dinâmica. Nele, você precisa fazer uma escolha local ideal a cada passo. Uma escolha local ideal pode levar a uma solução global ruim.

À medida que você explora novos conceitos, consulte os tutoriais do TopCoder . Eles são muito detalhados e compreensíveis. Graças a eles, eu consegui entender as árvores indexadas binárias .

Trabalhe 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 computadores começaram em setembro e terminavam em abril.

Todos os dias, durante esses 8 meses, pratiquei por 5 horas.

E sim, passei essas 5 horas apenas na solução de problemas algorítmicos. Lembro-me dos dias em que praticava por 8 e até 10 horas. Porque Porque gostei. Todos os dias, voltando da escola para casa, ia direto para o quarto, sentava-se ao computador e começava a resolver um novo problema. Ou estudou um novo algoritmo que você precisava conhecer para resolver esse problema.

Se você quer ganhar, você deve fazer o mesmo. Escolha um problema e cumpra-o. Pense nisso enquanto caminha pela estrada até o supermercado ou enquanto dirige.

imagem

Você sabia que durante o sono seu cérebro desfragmenta as informações coletadas neste dia? Ele parece estar empilhando livros em ordem alfabética em uma estante. Essencialmente, seu cérebro pensa nos vários problemas que você encontrou.

Isso pode ser usado com habilidade. Antes de ir para a cama, leia o problema difícil e lembre-se do que você precisa para resolvê-lo. Neste ponto, você não precisa procurar a solução em si. Vá para a cama. Seu cérebro começará a lidar com esse problema. Ao acordar, você ficará surpreso ao perceber que encontrou uma solução enquanto dorme.

Tente você mesmo. Parece mágica.

Eu criei um blog de vídeo


imagem

Este breve parágrafo não está relacionado à programação esportiva. Se você tem mais de vinte anos e está interessado em como eu vejo o mundo, assista ao meu blog de vídeos no Youtube . Falo sobre o mundo, a vida e a ciência da computação.

Trabalhe com sabedoria


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

Somos pessoas e gostamos de procrastinar . Sempre queremos adiar o que precisa ser feito agora. Assistir à Netflix é sempre melhor do que lidar com problemas de programação dinâmica. Você sabe disso e precisa corrigi-lo.

Como vencer a procrastinação


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

Então, foi assim que superei a procrastinação. Comecei um calendário em papel e preenchi todos os dias os problemas que queria resolver. Sempre preenchi os problemas com antecedência, dois dias antes. Portanto, eu sabia como administrar meu tempo nos dias seguintes.

imagem

Assim, eu sempre tive motivação. Eu precisava resolver alguns problemas e encontrar novos para preencher nos dias seguintes no calendário. Atravessar os problemas resolvidos é muito bom. Eu sei que você também gosta.

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

Como estrear efetivamente


Quer se tornar um profissional? Se assim for, então você precisa se degradar na mente.
Essa é de longe a técnica de depuração mais eficaz que eu conheço, porque não requer um depurador. Seu cérebro examina vários ramos do código ao mesmo tempo e oferece uma visão geral muito mais ampla do código em comparação com o depurador clássico .

Você pode se comparar com um grande mestre que joga xadrez e pensa em 3 passos à frente.

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

Para aprender como se degradar na mente, é preciso praticar. Quando você aprova uma solução para um problema e obtém uma "resposta errada", não vá diretamente para o botão do depurador. Releia o código e pense: “O que acontece nesta linha?”, “Como o“ se ”afeta o programa?”, “Quando saímos do loop, qual é o valor do iterador?”.

Então você está pensando por si próprio. Com o tempo, você aprenderá a escrever código e lançá-lo em movimento.

Sobre o autor

imagem
Andrei Margeloiu é um programador ávido, interessado em empreendedorismo, startups e natureza. Você pode entrar em contato com ele no LinkedIn .

Tradução: Diana Sheremyova


Leia também o blog
Empresa EDISON:


20 bibliotecas para
aplicação iOS espetacular

Source: https://habr.com/ru/post/pt473590/


All Articles