Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

Valmistusin Google HashCode'i maailmameistrivõistluste finaaliks 2017. See on suurim Google'i korraldatud algoritmiliste probleemidega võistlus.

Alustasin C++ õppimist nullist üheksandas klassis. Ma ei teadnud programmeerimisest, algoritmidest ega andmestruktuuridest midagi. Mingil hetkel kirjutasin oma esimese koodirea. Seitse kuud hiljem kerkis silmapiirile programmeerimisvõistlus. Tahtsin näha, kui hästi minu programmeerimise õppimisstiil töötab. See oli ideaalne võimalus.

Pärast kahte võistluspäeva tulid ka tulemused: võitsin kuldmedali.

Ma olin šokeeritud. Olin 5-aastase kogemusega konkurentidest ees. Teadsin, et olin kõvasti tööd teinud, kuid see saavutus ületas kõik mu ootused. Sain aru, et spordiprogrammeerimine on minu teema ja läksin sellesse ülepeakaela.

Ma tean, mis viis mind eduni ja tahan seda teiega jagada.

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

Artikkel on tõlgitud EDISON Tarkvara toel, mis hoolitseb programmeerijate tervise ja nende hommikusöögi eest ning arendab kohandatud tarkvara.

Millist programmeerimiskeelt valida

  • C++ - Soovitan soojalt! Ta on väga kiire. Algoritmide juurutamine võtab STL-i tõttu vähe aega. C++ on aktsepteeritud kõigil võistlustel. Kirjutasin oma esimese koodirea C++ keeles.
  • C – STL-i tõttu õppige C++. Kui oskad C-d, oskad programmeerida ka C++ keeles.
  • Java on aeglane programmeerimiskeel. Sellel on suurte täisarvude klass, kuid see ei aita teid palju. Kui võistlusel on ajalimiit, siis Javaga ületate selle kindlasti. Java ei aktsepteerita kõigil võistlustel.

Kus saab harjutada

Soovitan Sphere Online Judge (SPOJ). See on kvantiteedi ja kvaliteedi mõttes tõhus ressurss. Toimetajad ja lahendused on Internetis saadaval, kui jääte probleemide lahendamise protsessi jänni. Lisaks sellele saidile soovitan SPOJ tööriistakomplekt и probleemi klassifikaator SPOJ.pl jaoks.

Esiteks peate lihvima oma põhiteadmisi

Kui olete keele süntaksiga harjunud, tuleb ületada mõned probleemid. Alustage lihtsatest probleemidest, mis nõuavad harjutamist. Selles etapis on peamine määrata oma programmeerimisstiil. Võib-olla meeldib teile kirjutada koodi, kus on palju tühikuid, võib-olla mitte. Võib-olla panete sulud samale reale kui "kui" või asetate need eraldi ridadele.

Peate leidma oma programmeerimisstiili, sest see on TEIE stiil.

Seda otsides pidage meeles kahte peamist põhimõtet:

  • Teie koodi peaks olema lihtne rakendada. Väljamõeldud lahenduse rakendamisel peaksite end mugavalt tundma. Miks? Sest võistluse ajal on viimane asi, mida sa tahad, oma koodi eksida. Alati on parem kulutada lisa5 minutit koodi juurutamise lihtsustamisele, kui kulutada 10 minutit selle väljamõtlemisele.
  • Teie kood peaks olema kergesti loetav. Kui koodi on lihtne lugeda, on seda lihtne siluda. Olgem ausad – vigu juhtub kogu aeg. Teate seda tunnet, kui teil on jäänud 10 minutit ja te ei leia seda kuradi viga? Muidugi teete. Selle olukorra vältimiseks kirjutage loetav kood. Kui hakkate seda siluma, tundub kood loomulik ja kergesti mõistetav.

Siin on minu näide programmeerimisstiil.

Kuidas parandada oma arenguoskusi

Harjuta, harjuta ja veel harjuta. Soovitan teil läbi töötada esimesed 250 kõige paremini lahendatavat probleemi SPOJ. Lahendage need järjekorras. Kulutage vähemalt tund aega, mõeldes igaühele lahendusele.

Ärge öelge: "See probleem on minu jaoks liiga raske, proovin järgmise lahendada." Nii arvavad luuserid.

Võtke paberitükk ja pliiats. Mõtle selle üle. Võib-olla leiad lahenduse, võib-olla mitte. Vähemalt arendate algoritmilist mõtlemist. Kui te tunni jooksul lahendust ei leia, otsige foorumist või artiklitest valmis lahendust.

Mida te selle lähenemisviisiga saavutate? Õppige oma ideid koodi abil kiiresti ellu viima. Ja uurige klassikalisi probleeme ja algoritme.

Teiseks peate valdama algoritme ja andmestruktuure

Järgige hierarhilist lähenemist. Kas hakkasite jooksma, teadmata, kuidas kõndida? Ei. Kas saate ehitada pilvelõhkujat ilma tugeva vundamendita? Mitte jälle.

Sa ei saa ignoreerida õppetee samme. Kui te neid ignoreerite, jäävad teile teadmiste lüngad. Aja jooksul muutuvad need ainult hullemaks.

Alustage põhialgoritmidest ja andmestruktuuridest

Raske on alustada. Võib-olla sellepärast, et te ei tea, mida kõigepealt õppida. Sellepärast Tegin videokursuse “Algoritmid ja andmestruktuurid”. Selle kursuse loomisel lähtusin sellest, kuidas mulle meeldiks, et mind õpetataks. Reaktsioon oli uskumatu! Esimese kuu jooksul registreerus kursusele üle 3000 õpilase enam kui 100 riigist.

Kui töötate lihtsate probleemide lahendamise kallal, ei parane te kunagi.

Kõige tõhusam viis mõista, mida te ei tea, on seda praktikas kogeda. Nii õppisin. Väljakutsuvat ülesannet valides õppisin palju uusi tehnikaid, millest ma polnud varem kuulnudki.

Iga kolmas probleem, millega tegelete, peaks teile midagi uut õpetama. Olge probleemide valimisel ettevaatlikum. Valige keerulisemad probleemid!

Kui olete need 250 SPOJ-i ülesannet täitnud, on teil põhiteadmised spordiprogrammide põhiteemadest. Põhialgoritmide loogika sügava mõistmisega tunduvad kõrgetasemelised algoritmid vähem keerukad. Nii saate oma teadmisi maksimaalselt ära kasutada.

Süvenege igasse põhiteemasse

Siin on väärtuslik ressurss rohke infoga. Sealt leiate iga teema 10 parimat algoritmi ja andmestruktuuri. Pärast SPOJ-i 250 probleemi saate sellest loendist palju teada. Kuid komistate ka paljude asjade otsa, millest te pole varem kuulnud. Nii et alustage nende teemade uurimist kasvavas järjekorras.

Kui te pärast millegi uue õppimist oma teadmisi ei tugevda, unustate kõik kiiresti.
Soovitan pärast uue algoritmi õppimist seda praktikas kasutada. Töötage läbi 2-3 ülesannet. Otsige SPOJ-st algoritmi silti. Sealt leiate ülesanded, mille lahendamiseks on vaja seda algoritmi. Esmalt lahendage need probleemid.

Õppige dünaamilist programmeerimist, sest see viib teid võiduni
Minu kogemuse põhjal on igal võistlusel vähemalt üks probleem dünaamiline programmeerimine. Paljudel inimestel tekib peavalu, kui nad kuulevad väljendit “dünaamiline programmeerimine”, sest nad ei saa sellest üldse aru.

Ja see on hea. Sest kui sa mõistad dünaamilist programmeerimist, siis võidad.

Mulle meeldib dünaamiline programmeerimine, see on mu lemmikteema. Dünaamilise programmeerimise saladus on teha globaalselt optimaalseid valikuid, mitte ainult kohalikke. Peate probleemi jaotama lihtsamateks alamprobleemideks. Lahendage kõik need alamülesanded ainult üks kord. Seejärel loo lahendus, mis ühendab lahendatud alamülesanded. Ahne algoritm - dünaamilise programmeerimise vastand. See nõuab igal etapil kohapeal optimaalsete valikute tegemist. Ja lokaalselt optimaalne valik võib viia halva globaalse lahenduseni.

Uute mõistete õppimise ajal vaadake TopCoderi õpetused. Need on väga üksikasjalikud ja arusaadavad. Tänu neile sain aru binaarselt indekseeritud puud.

Tööta kõvasti

Kas olete kunagi kuulnud sportlastest, kes võidavad olümpiamängud ilma aastatepikkuse harjutamiseta? Mina mitte.

Igal aastal algas ettevalmistus arvutiolümpiaadiks septembris ja lõppes aprillis.

Iga päev harjutasin need 8 kuud 5 tundi.

Ja jah, ma kulutasin need 5 tundi ainult algoritmiliste ülesannete lahendamisele. Mäletan aegu, mil harjutasin 8 ja isegi 10 tundi. Miks? Sest mulle meeldis. Iga päev koolist koju jõudes läksin otse magamistuppa, istusin arvuti taha ja hakkasin uut probleemi analüüsima. Või õppisin uut algoritmi, mida pidin selle probleemi lahendamiseks teadma.

Kui tahad võita, pead sama tegema. Valige probleem ja jääge selle juurde. Mõelge sellele supermarketisse kõndides või autoga sõites.

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

Kas teadsite, et magades defragmenteerib teie aju sel päeval kogutud teabe? Näib, et ta laostab raamatuid riiulile tähestikulises järjekorras. Põhimõtteliselt mõtleb teie aju erinevatele probleemidele, millega te silmitsi seisate.

Seda saab oskuslikult kasutada. Enne magamaminekut lugege läbi mõni keeruline probleem ja pidage meeles, mida selle lahendamiseks vaja on. Selles etapis ei pea te ise lahendust otsima. Mine voodisse. Teie aju hakkab seda probleemi töötlema. Ärgates mõistad üllatusega, et leidsid lahenduse magades.

Proovige ise. See on nagu maagia.

Tegin videoblogi

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

See lühike lõik ei ole seotud spordiprogrammidega. Kui olete kahekümnendates ja mõtlete, kuidas ma maailma näen, võiksite seda vaadata minu videoblogi Youtube'is. Räägin selles maailmast, elust ja arvutiteadusest.

Töötage targalt

See on edu saladus. Teil on vaja eesmärke.

Oleme inimesed ja see meeldib meile viivitada. Me tahame alati edasi lükata seda, mida on vaja praegu teha. Netflixi vaatamine on alati nauditavam kui dünaamiliste programmeerimisprobleemidega tegelemine. Sa tead seda ja pead selle parandama.

Kuidas võita viivitamist

Sea endale eesmärgid. Alati leiate huvitavaid probleeme, millest saate midagi uut õppida (vaadake ülalmainitud ressursse). Kuid need probleemid tuleb lahendada, mitte ainult lugeda.

Nii et siin on, kuidas ma viivitusest üle sain. Panin käima paberkalendri ja täitsin iga päeva probleemidega, mida soovisin lahendada. Täitsin alati ülesanded kaks päeva ette. Seega teadsin, kuidas oma aega järgmistel päevadel juhtida.

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st

Seega olin alati motiveeritud. Mul oli vaja lahendada mõned probleemid ja leida uued, et täita järgmised kalendripäevad. Lahendatud probleemide mahajätmine tundub hea. Ma tean, et ka sulle meeldib.

Hankige oma paberkalender. Ärge looge oma telefoni järjekordset ülesannete nimekirja, mille homme unustate.

Kuidas tõhusalt siluda

Kas soovite saada professionaaliks? Kui jah, siis peate selle oma meelest siluma.
See on kõige tõhusam silumistehnika, mida ma tean, kuna see ei vaja silurit. Teie aju uurib korraga mitut koodiharu ja annab teile koodiga võrreldes palju laiema ülevaate klassikaline silur.

Võid end võrrelda suurmeistriga, kes mängib malet ja mõtleb 3 käiku ette.

Kasutan seda tehnikat ainult oma esialgse kaitseliinina. Siis kasutan tõelist silurit.

Peas silumise õppimiseks peate harjutama. Kui kinnitate probleemi lahendust ja saate "vale vastuse", ärge minge otse siluri nupule. Lugege kood uuesti läbi ja mõelge: "Mis sellel real toimub?", "Kuidas siin olev "kui" programmi mõjutab?", "Kui me tsüklist väljume, mis on iteraatori väärtus?"

Nii mõtled ise. Aja jooksul õpid koodi kirjutama ja seda jooksvalt siluma.

Teave Autor

Kuidas ma võitsin arvutamise olümpiaadil 3 kuldmedalist 4-st
Andrei Margeloiu on innukas programmeerija, kes tunneb huvi ettevõtluse, idufirmade ja vabaõhu vastu. Võite temaga ühendust võtta LinkedInis.

Tõlge: Diana Šeremyeva

Allikas: www.habr.com

Lisa kommentaar