Comment j'ai remporté 3 des 4 médailles d'or à l'Olympiade informatique

image

Je me préparais pour la finale de la Coupe du monde Google HashCode 2017. Il s'agit du plus grand concours de problèmes algorithmiques organisé par Google.

J'ai commencé à apprendre le C ++ à partir de zéro en neuvième année. Je ne connaissais rien à la programmation, aux algorithmes et aux structures de données. À un moment donné, j'ai écrit ma première ligne de code. Sept mois plus tard, une Olympiade de programmation se profile à l'horizon. Je voulais savoir à quel point mon style de programmation d'apprentissage fonctionnait. C'était une opportunité idéale.

Après deux jours de compétition, les résultats sont arrivés: j'ai gagné une médaille d'or.

J'étais sous le choc. J'ai pris de l'avance sur les concurrents avec 5 ans d'expérience. Je savais que je travaillais dur, mais cette réussite a dépassé toutes mes attentes. J'ai réalisé que la programmation sportive est mon sujet et je l'ai abordé avec ma tête.

Je sais ce qui m'a mené au succès et je veux partager cela avec vous.

Logiciel EDISON - développement web
Cet article a été traduit avec le soutien du logiciel EDISON, qui s'occupe de la santé des programmeurs et de leur petit - déjeuner , et développe également des logiciels personnalisés .


Quel langage de programmation choisir


  • C ++ - Hautement recommandé! Il est très rapide. La mise en œuvre des algorithmes prend peu de temps en raison de la STL. C ++ est accepté dans toutes les compétitions. J'ai écrit ma première ligne de code en C ++.
  • C - apprendre le C ++ grâce à STL. Si vous connaissez C, vous pouvez également programmer en C ++.
  • Java est un langage de programmation lent. Il a une classe Big Integer, mais cela ne vous aide pas vraiment. Si la compétition a une limite de temps, vous la dépasserez probablement avec Java. Java n'est pas accepté dans toutes les compétitions.


Où pouvez-vous pratiquer


Je recommande Sphere Online Judge (SPOJ) . C'est une ressource efficace en termes de quantité et de qualité. Les éditeurs et les solutions sont disponibles en ligne si vous êtes coincé dans le processus de résolution de problèmes. En plus de ce site, je recommande le SPOJ Toolkit et le classificateur de problèmes pour SPOJ.pl.

Tout d'abord, vous devez perfectionner les bases


Une fois que vous vous serez habitué à la syntaxe du langage, vous devrez résoudre certains problèmes. Commencez par des problèmes simples qui nécessitent de la pratique. A ce stade, l'essentiel est de déterminer votre style de programmation. Peut-être que vous aimez écrire du code avec beaucoup d'espaces, ou peut-être pas. Vous pouvez peut-être mettre les crochets sur la même ligne que le «si», ou vous pouvez les mettre sur des lignes distinctes.

Vous devez trouver votre style de programmation car c'est VOTRE style.

Lorsque vous le recherchez, n'oubliez pas deux principes de base:

  • Votre code doit être facile à implémenter. Vous devriez vous sentir à l'aise de mettre en œuvre la solution que vous avez trouvée. Pourquoi? Parce que pendant la compétition, la dernière chose que vous voulez, c'est vous perdre dans votre code. Il est toujours préférable de réfléchir à la façon de simplifier la mise en œuvre du code, que de passer 10 minutes pour le comprendre.
  • Votre code doit être facile à lire. Lorsque le code est facile à lire, il est facile à déboguer. Avouons-le - les erreurs apparaissent constamment. Connaissez-vous la sensation même quand il reste 10 minutes jusqu'à la fin et vous ne trouvez pas la fichue erreur? Bien sûr, tu sais. Pour éviter cette situation, écrivez du code lisible. Lorsque vous commencez à le déboguer, le code semble naturel et facile à comprendre.


Voici un exemple de mon style de programmation.

Comment améliorer vos compétences en développement


Pratiquez, pratiquez et répétez. Je vous recommande de parcourir les 250 premières tâches les plus résolues sur SPOJ . Résolvez-les dans l'ordre. Prenez au moins une heure pour réfléchir aux solutions à chacun d'eux.

Ne dites pas: "Ce problème est trop compliqué pour moi, je vais essayer de résoudre ce qui suit." Alors les perdants pensent.

Prenez un morceau de papier et un crayon. Pensez-y. Peut-être que vous pouvez trouver une solution, ou peut-être pas. Au minimum, vous développerez une réflexion algorithmique. Si vous ne parvenez pas à trouver une solution en moins d'une heure, recherchez une solution toute faite sur le forum ou dans les articles.

Qu'allez-vous réaliser avec cette approche? Apprenez à mettre en œuvre rapidement vos idées avec du code. Et découvrez des problèmes et des algorithmes classiques.

Deuxièmement, vous devez maîtriser les algorithmes et les structures de données


Suivez une approche hiérarchique. Avez-vous commencé à courir sans marcher? Non. Pouvez-vous construire un gratte-ciel sans une base solide? Pas encore.

Vous ne pouvez pas ignorer les étapes du parcours d'apprentissage. Si vous les ignorez, vous aurez toujours des lacunes dans les connaissances. Au fil du temps, ils ne feront qu'empirer.

Commencez avec des algorithmes fondamentaux et des structures de données


C'est difficile de commencer. Peut-être parce que vous ne savez pas quoi étudier en premier. J'ai donc créé un cours vidéo "Algorithmes et structures de données". En créant ce cours, je me suis appuyé sur la façon dont j'aimerais qu'on m'enseigne. La réaction a été incroyable! Plus de 3 000 étudiants de plus de 100 pays se sont inscrits au cours le premier mois.

Si vous travaillez pour résoudre des problèmes faciles, vous ne vous améliorerez jamais.

Le moyen le plus efficace de comprendre ce que vous ne savez pas est de vous y retrouver en pratique. J'ai donc étudié. J'ai appris beaucoup de nouvelles techniques dont je n'avais jamais entendu parler auparavant, choisissant une tâche difficile.

Chaque troisième problème sur lequel vous travaillez devrait vous apprendre quelque chose de nouveau. Soyez prudent lorsque vous choisissez un problème. Choisissez des problèmes plus difficiles!

Après avoir terminé ces 250 tâches du SPOJ, vous aurez une compréhension commune des principaux sujets de la programmation sportive. Grâce à une compréhension approfondie de la logique sous-jacente aux algorithmes de base, les algorithmes de haut niveau sembleront moins compliqués. Ainsi, vous pouvez utiliser vos connaissances au maximum.

Creusez plus profondément dans chacun des sujets principaux.


Voici une ressource précieuse avec beaucoup d'informations. Vous y trouverez les 10 meilleurs algorithmes et structures de données pour chaque sujet. Après 250 problèmes de SPOJ, vous en saurez beaucoup sur cette liste. Mais aussi tomber sur beaucoup de choses qui n'ont jamais été entendues auparavant. Par conséquent, commencez à explorer ces sujets par ordre croissant.

Si vous ne renforcez pas vos connaissances après avoir appris quelque chose de nouveau, vous oublierez rapidement tout.
Je recommande qu'après avoir appris le nouvel algorithme, l'utiliser dans la pratique. Travaillez-le sur 2-3 tâches. Recherchez la balise d'algorithme dans SPOJ. Vous y trouverez des problèmes pour la solution desquels cet algorithme est nécessaire. Triez d'abord ces problèmes.

Traitez la programmation dynamique car elle vous mènera à la victoire
D'après mon expérience, dans chaque compétition, il y a au moins un problème de programmation dynamique . Beaucoup de gens ont mal à la tête lorsqu'ils entendent l'expression «programmation dynamique» parce qu'ils ne la comprennent pas du tout.

Et c'est bien. Parce que si vous comprenez la programmation dynamique, vous gagnerez.

J'aime la programmation dynamique, c'est mon sujet préféré. Le secret de la programmation dynamique est de faire des choix globalement optimaux, pas seulement locaux. Vous devez décomposer le problème en sous-tâches plus simples. Résolvez chacune de ces sous-tâches une seule fois. Créez ensuite une solution qui combine les sous-tâches résolues. Un algorithme gourmand est l'opposé de la programmation dynamique. Dans ce document, vous devez faire un choix localement optimal à chaque étape. Un choix localement optimal peut conduire à une mauvaise solution globale.

Lorsque vous explorez de nouveaux concepts, consultez les didacticiels TopCoder . Ils sont très détaillés et compréhensibles. Grâce à eux, j'ai pu comprendre les arbres indexés binaires .

Travailler dur


Avez-vous déjà entendu parler d'athlètes qui remportent les Jeux olympiques sans des années de pratique? Non.

Chaque année, les préparatifs de l'olympiade informatique ont commencé en septembre et se sont terminés en avril.

Chaque jour pendant ces 8 mois j'ai pratiqué pendant 5 heures.

Et oui, j'ai passé ces 5 heures uniquement à résoudre des problèmes algorithmiques. Je me souviens des jours où je pratiquais pendant 8 et même 10 heures. Pourquoi? Parce que je l'ai aimé. Chaque jour, en rentrant de l'école, je suis allé directement dans la chambre, me suis assis devant l'ordinateur et j'ai commencé à régler un nouveau problème. Vous avez également étudié un nouvel algorithme que vous deviez connaître pour résoudre ce problème.

Si vous voulez gagner, vous devez faire de même. Choisissez un problème et respectez-le. Pensez-y en marchant le long de la route du supermarché ou en conduisant.

image

Savez-vous que pendant le sommeil, votre cerveau défragmente les informations recueillies ce jour-là? Il semble empiler des livres par ordre alphabétique sur une étagère. Essentiellement, votre cerveau pense aux divers problèmes que vous avez rencontrés.

Cela peut être habilement utilisé. Avant de vous coucher, lisez le problème difficile et souvenez-vous de ce dont vous avez besoin pour le résoudre. À ce stade, vous n'avez pas besoin de rechercher la solution elle-même. Va te coucher. Votre cerveau commencera à gérer ce problème. Au réveil, vous serez surpris de constater que vous avez trouvé une solution pendant que vous dormez.

Essayez-le vous-même. Cela ressemble à de la magie.

J'ai créé un blog vidéo


image

Ce court paragraphe n'est pas lié à la programmation sportive. Si vous avez plus de vingt ans et que vous souhaitez savoir comment je vois le monde, vous pouvez regarder mon blog vidéo sur Youtube . J'y parle du monde, de la vie et de l'informatique.

Travaillez sagement


C'est le secret du succès. Vous avez besoin d'objectifs.

Nous sommes des gens et nous aimons tergiverser . Nous voulons toujours reporter ce qui doit être fait dès maintenant. Regarder Netflix est toujours plus agréable que de traiter des problèmes de programmation dynamique. Vous le savez et vous devez le réparer.

Comment vaincre la procrastination


Fixez-vous des objectifs. Vous trouverez toujours des problèmes intéressants à partir desquels vous pouvez apprendre quelque chose de nouveau (consultez les ressources que j'ai mentionnées ci-dessus). Mais ces problèmes doivent être résolus, pas seulement lire à leur sujet.

C'est ainsi que j'ai surmonté la procrastination. J'ai commencé un calendrier papier et rempli tous les jours les problèmes que je voulais résoudre. J'ai toujours rempli les problèmes à l'avance, deux jours plus tôt. Par conséquent, j'ai su gérer mon temps dans les jours suivants.

image

Ainsi, j'ai toujours eu de la motivation. J'avais besoin de résoudre certains problèmes et d'en trouver de nouveaux à remplir les jours suivants sur le calendrier. Rayer les problèmes résolus est très agréable. Je sais que tu l'aimes aussi.

Obtenez votre propre calendrier papier. Ne créez pas une autre liste de tâches sur votre téléphone que vous oublierez demain.

Comment débuter efficacement


Envie de devenir professionnel? Si c'est le cas, alors vous devez abaisser l'esprit.
C'est de loin la technique de débogage la plus efficace que je connaisse, car elle ne nécessite aucun débogueur. Votre cerveau examine plusieurs branches de code en même temps et vous donne un aperçu beaucoup plus large du code par rapport au débogueur classique .

Vous pouvez vous comparer à un grand maître qui joue aux échecs et pense que 3 mouvements à venir.

J'utilise cette technique uniquement comme ligne de défense de départ. Ensuite, j'utilise un vrai débogueur.

Pour apprendre à abaisser l'esprit, il faut s'entraîner. Lorsque vous approuvez une solution à un problème et obtenez une «mauvaise réponse», n'allez pas directement au bouton du débogueur. Relisez le code et pensez: «Que se passe-t-il sur cette ligne?», «Comment« si »affecte-t-il le programme?», «Lorsque nous quittons la boucle, quelle est la valeur de l'itérateur?».

Vous pensez donc par vous-même. Au fil du temps, vous apprendrez à écrire du code et à le lancer lors de vos déplacements.

À propos de l'auteur

image
Andrei Margeloiu est un programmeur passionné qui s'intéresse à l'entrepreneuriat, aux startups et à la nature. Vous pouvez le contacter sur LinkedIn .

Traduction: Diana Sheremyova


Lisez aussi le blog
Société EDISON:


20 bibliothèques pour
application iOS spectaculaire

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


All Articles