Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Ik was me aan het voorbereiden op de Google HashCode Wereldkampioenschapsfinale 2017. Dit is de grootste competitie met algoritmische problemen georganiseerd door Google.

Ik begon C++ helemaal opnieuw te leren in de negende klas. Ik wist niets van programmeren, algoritmen of datastructuren. Op een gegeven moment schreef ik mijn eerste regel code. Zeven maanden later doemde de programmeerwedstrijd aan de horizon op. Ik wilde zien hoe goed mijn stijl van leren programmeren werkte. Het was de perfecte gelegenheid.

Na twee dagen competitie kwam de uitslag: ik won de gouden medaille.

Ik was geschokt. Met 5 jaar ervaring lag ik voor op de concurrentie. Ik wist dat ik hard had gewerkt, maar deze prestatie overtrof al mijn verwachtingen. Ik besefte dat sportprogrammering mijn onderwerp was en dook er hals over kop in.

Ik weet wat mij tot succes heeft geleid en ik wil het met je delen.

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Het artikel is vertaald met de steun van EDISON Software, dat zorgt voor de gezondheid van programmeurs en hun ontbijtEn ontwikkelt software op maat.

Welke programmeertaal te kiezen

  • C++ - Sterk aanbevolen! Hij is erg snel. Implementatie van algoritmen kost dankzij STL weinig tijd. C++ wordt geaccepteerd in alle competities. Ik schreef mijn eerste regel code in C++.
  • C - Leer C++ dankzij de STL. Als je C kent, kun je ook programmeren in C++.
  • Java is een langzame programmeertaal. Het heeft een Big Integer-klasse, maar het zal je niet veel helpen. Als een wedstrijd een tijdslimiet heeft, zul je die met Java zeker overschrijden. Java wordt niet bij alle wedstrijden geaccepteerd.

Waar kun je oefenen

Ik raad aan Sphere Online Rechter (SPOJ). Het is een effectieve hulpbron in termen van kwantiteit en kwaliteit. Editors en oplossingen zijn online beschikbaar als u vastloopt bij het oplossen van problemen. Als aanvulling op deze site raad ik aan SPOJ-toolkit и probleemclassificatie voor SPOJ.pl.

Eerst moet u uw kennis van de basisbeginselen aanscherpen

Als u eenmaal gewend bent aan de syntaxis van de taal, zijn er enkele problemen die u moet overwinnen. Begin met eenvoudige problemen die oefening vereisen. In dit stadium is het belangrijkste om uw programmeerstijl te bepalen. Misschien schrijf je graag code met veel witruimte, misschien niet. Mogelijk plaatst u de haakjes op dezelfde regel als de 'als', of plaatst u ze op afzonderlijke regels.

Je moet je programmeerstijl vinden, want het is JOUW stijl.

Als je ernaar zoekt, onthoud dan twee basisprincipes:

  • Uw code moet eenvoudig te implementeren zijn. U moet zich op uw gemak voelen bij het implementeren van de oplossing die u bedenkt. Waarom? Want tijdens een wedstrijd wil je niet verdwalen in je code. Het is altijd beter om 5 minuten extra te besteden aan het nadenken over hoe je de implementatie van de code kunt vereenvoudigen, dan 10 minuten te besteden aan het uitzoeken ervan.
  • Uw code moet gemakkelijk te lezen zijn. Als code gemakkelijk te lezen is, zijn fouten ook gemakkelijk te debuggen. Laten we eerlijk zijn: bugs komen voortdurend voor. Ken je dat gevoel dat je nog tien minuten hebt en de verdomde fout niet kunt vinden? Natuurlijk doe je dat. Om deze situatie te voorkomen, schrijft u leesbare code. Zodra u begint met het debuggen, zal de code natuurlijk en gemakkelijk te begrijpen lijken.

Hier is een voorbeeld van mij programmeerstijl.

Hoe u uw ontwikkelingsvaardigheden kunt verbeteren

Oefenen, oefenen en nog eens oefenen. Ik raad aan dat u de eerste 250 meest oplosbare problemen doorwerkt SPOJ. Los ze op volgorde op. Denk minstens een uur na over de oplossing voor elk van deze problemen.

Zeg niet: "Dit probleem is te moeilijk voor mij, ik zal proberen het volgende op te lossen." Dit is hoe verliezers denken.

Neem een ​​stuk papier en een potlood. Denk er over na. Misschien kun je een oplossing vinden, misschien ook niet. Je ontwikkelt op zijn minst algoritmisch denken. Lukt het je niet om binnen een uur tot een oplossing te komen, zoek dan een kant-en-klare oplossing op het forum of in artikelen.

Wat ga je bereiken met deze aanpak? Leer hoe u uw ideeën snel kunt implementeren met behulp van code. En bestudeer klassieke problemen en algoritmen.

Ten tweede moet je algoritmen en datastructuren beheersen

Volg een hiërarchische aanpak. Ben je begonnen met hardlopen zonder te weten hoe je moest lopen? Nee. Kun je een wolkenkrabber bouwen zonder een solide fundering? Niet weer.

Je kunt de stappen op het leerpad niet negeren. Als je ze negeert, blijf je achter met kennislacunes. Na verloop van tijd zullen ze alleen maar erger worden.

Begin met fundamentele algoritmen en datastructuren

Het is moeilijk om te beginnen. Misschien omdat je niet weet wat je eerst moet studeren. Daarom Ik heb een videocursus “Algoritmen en datastructuren” gemaakt. Bij het maken van deze cursus heb ik deze gebaseerd op de manier waarop ik les zou willen krijgen. De reactie was ongelooflijk! In de eerste maand schreven ruim 3000 studenten uit meer dan 100 landen zich in voor de cursus.

Als je werkt aan het oplossen van eenvoudige problemen, zul je nooit beter worden.

De meest effectieve manier om te begrijpen wat je niet weet, is door het in de praktijk te ervaren. Zo heb ik het geleerd. Ik heb veel nieuwe technieken geleerd waar ik nog nooit van had gehoord door een uitdagende taak te kiezen.

Elk derde probleem waaraan u werkt, zou u iets nieuws moeten leren. Wees voorzichtiger bij het kiezen van problemen. Kies moeilijkere problemen!

Zodra u deze 250 problemen van SPOJ heeft voltooid, heeft u een basiskennis van de kernonderwerpen van sportprogrammering. Met een diep begrip van de logica achter basisalgoritmen zullen algoritmen op hoog niveau minder complex lijken. Zo kunt u uw kennis optimaal benutten.

Duik dieper in elk van de hoofdthema’s

Hier is een waardevolle hulpbron met veel informatie. Daar vindt u voor elk onderwerp de top 10 algoritmen en datastructuren. Na 250 problemen van SPOJ weet je veel uit deze lijst. Maar je zult ook veel dingen tegenkomen waar je nog nooit van hebt gehoord. Begin deze onderwerpen dus in oplopende volgorde te bestuderen.

Als je je kennis niet versterkt nadat je iets nieuws hebt geleerd, zul je snel alles vergeten.
Ik raad aan dat je, nadat je een nieuw algoritme hebt geleerd, het in de praktijk gebruikt. Werk het door 2-3 taken heen. Zoek naar de algoritmetag in SPOJ. Daar zul je problemen vinden die dit algoritme nodig heeft om op te lossen. Pak deze problemen eerst aan.

Beheers dynamisch programmeren omdat het u naar de overwinning zal leiden
Vanuit mijn ervaring heeft elke competitie minstens één probleem dynamisch programmeren. Veel mensen krijgen hoofdpijn als ze de uitdrukking “dynamisch programmeren” horen, omdat ze er helemaal niets van begrijpen.

En dit is goed. Want als je dynamisch programmeren begrijpt, dan zul je winnen.

Ik hou van dynamisch programmeren, het is mijn favoriete onderwerp. Het geheim van dynamisch programmeren is het maken van globaal optimale keuzes, niet alleen lokale. Je moet het probleem opsplitsen in eenvoudiger deelproblemen. Los elk van deze deelproblemen slechts één keer op. Creëer vervolgens een oplossing die de opgeloste deelproblemen combineert. Hebzuchtig algoritme - het tegenovergestelde van dynamisch programmeren. Het vraagt ​​om het maken van lokaal optimale keuzes bij elke stap. En een lokaal optimale keuze kan leiden tot een slechte mondiale oplossing.

Terwijl je nieuwe concepten leert, kijk eens naar TopCoder-tutorials. Ze zijn zeer gedetailleerd en begrijpelijk. Dankzij hen kon ik het begrijpen binair geïndexeerde bomen.

Werk hard

Heb je ooit gehoord van atleten die de Olympische Spelen winnen zonder jarenlang te oefenen? Ik niet.

Jaarlijks begonnen de voorbereidingen voor de Computerolympiade in september en eindigden in april.

Gedurende deze 8 maanden oefende ik elke dag 5 uur.

En ja, ik heb deze 5 uur alleen besteed aan het oplossen van algoritmische problemen. Ik herinner me de dagen dat ik 8 en zelfs 10 uur oefende. Waarom? Omdat ik het leuk vond. Elke dag als ik thuiskwam van school, ging ik meteen naar de slaapkamer, ging achter de computer zitten en begon een nieuw probleem te analyseren. Of ik leerde een nieuw algoritme dat ik moest kennen om dit probleem op te lossen.

Als je wilt winnen, moet je hetzelfde doen. Kies een probleem en houd je daaraan. Denk er eens over na terwijl u naar de supermarkt loopt of tijdens het rijden.

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Wist u dat uw hersenen tijdens uw slaap de informatie die die dag is verzameld, defragmenteren? Het lijkt erop dat hij boeken in alfabetische volgorde op een boekenplank stapelt. In wezen denken uw hersenen na over de verschillende problemen waarmee u wordt geconfronteerd.

Dit kan vakkundig worden gebruikt. Lees voordat u naar bed gaat een moeilijk probleem en onthoud wat er nodig is om het op te lossen. In dit stadium hoeft u niet naar de oplossing zelf te zoeken. Ga naar bed. Je hersenen zullen dit probleem beginnen te verwerken. Als je wakker wordt, zul je verbaasd zijn als je beseft dat je de oplossing hebt gevonden terwijl je sliep.

Probeer het zelf. Het is net magie.

Ik heb een videoblog gemaakt

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Deze korte paragraaf heeft geen betrekking op sportprogramma's. Als je in de twintig bent en je afvraagt ​​hoe ik de wereld zie, wil je misschien eens een kijkje nemen mijn videoblog op Youtube. Ik praat over de wereld, het leven en de computerwetenschappen daarin.

Werk Slim

Dit is het geheim van succes. Je hebt doelen nodig.

Wij zijn mensen en dat vinden we leuk uitstellen. We willen altijd uitstellen wat er nu moet gebeuren. Netflix kijken is altijd leuker dan omgaan met dynamische programmeerproblemen. Je weet dit en je moet het oplossen.

Hoe uitstelgedrag te verslaan

Stel jezelf doelen. Je zult altijd interessante problemen vinden waarvan je iets nieuws kunt leren (bekijk de bronnen die ik hierboven noemde). Maar deze problemen moeten worden opgelost en er moet niet alleen over worden gelezen.

Dus hier is hoe ik uitstelgedrag overwon. Ik begon met een papieren kalender en vulde elke dag met problemen die ik wilde oplossen. Ik vul de opgaven altijd twee dagen van tevoren in. Zo wist ik hoe ik de volgende dagen mijn tijd moest indelen.

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade

Ik was dus altijd gemotiveerd. Ik moest een aantal problemen oplossen en nieuwe vinden om de volgende dagen op de kalender te vullen. Het afstrepen van opgeloste problemen voelt geweldig. Ik weet dat jij het ook leuk vindt.

Koop uw eigen papieren kalender. Maak geen nieuwe takenlijst op uw telefoon die u morgen vergeet.

Hoe effectief te debuggen

Wil je een professional worden? Zo ja, dan moet je ‘het in je hoofd debuggen’.
Dit is veruit de meest efficiënte debugging-techniek die ik ken, omdat er helemaal geen debugger voor nodig is. Je hersenen onderzoeken meerdere codetakken tegelijk en geven je een veel breder overzicht van de code vergeleken met klassieke debugger.

Je kunt jezelf vergelijken met een grootmeester die schaakt en 3 zetten vooruit denkt.

Ik gebruik deze techniek uitsluitend als mijn eerste verdedigingslinie. Dan gebruik ik een echte debugger.

Om te leren debuggen in je hoofd, moet je oefenen. Wanneer u een oplossing voor een probleem valideert en een "verkeerd antwoord" krijgt, ga dan niet rechtstreeks naar de debuggerknop. Lees de code opnieuw en denk: "Wat gebeurt er in deze regel?", "Hoe beïnvloedt de "als" hier het programma?", "Wat is de waarde van de iterator als we de lus verlaten?"

Zo denk je zelf na. Na verloop van tijd zul je leren code te schrijven en deze direct te debuggen.

Over de auteur

Hoe ik 3 van de 4 gouden medailles won op de Computerolympiade
Andrei Margeloiu is een fervent programmeur met interesse in ondernemerschap, startups en het buitenleven. U kunt contact met hem opnemen op LinkedIn.

Vertaling: Diana Sheremyeva

Bron: www.habr.com

Voeg een reactie