Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

A 2017-es Google HashCode világbajnokság döntőjére készültem. Ez a Google által szervezett legnagyobb algoritmikus kihívás.

Kilencedik osztályban a nulláról kezdtem el tanulni a C++-t. Semmit sem tudtam a programozásról, az algoritmusokról és az adatstruktúrákról. Valamikor megírtam az első kódsoromat. Hét hónappal később egy programozási verseny derengett a láthatáron. Tudni akartam, hogy mennyire működik jól a programozási tanulási stílusom. Ez volt a tökéletes lehetőség.

Két nap verseny után jöttek az eredmények: aranyérmet nyertem.

Megdöbbentem. 5 év tapasztalattal kerültem a verseny elé. Tudtam, hogy keményen dolgozom, de ez a teljesítmény minden várakozásomat felülmúlta. Rájöttem, hogy a sportprogramozás a témám, és fejjel mentem bele.

Tudom, mi vezetett a sikerhez, és szeretném megosztani veletek.

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

A cikk az EDISON Software támogatásával készült, amely gondoskodik a programozók egészségéről és a reggelijükrőlÉs egyedi szoftvereket fejleszt.

Milyen programozási nyelvet válasszunk

  • C++ - Erősen ajánlott! Nagyon gyors. Az algoritmusok megvalósítása kevés időt vesz igénybe az STL miatt. A C++ minden versenyen elfogadott. Az első kódsoromat C++ nyelven írtam.
  • C - tanuld meg a C++-t az STL miatt. Ha ismeri a C-t, akkor C++-ban is tud majd programozni.
  • A Java egy lassú programozási nyelv. Van egy Big Integer osztálya, de ez nem sokat segít. Ha a versenynek van időkorlátja, a Java-val biztosan túlléped. A Java nyelvet nem minden versenyen fogadják el.

Hol lehet gyakorolni

ajánlom Sphere Online Judge (SPOJ). Mennyiségi és minőségi szempontból hatékony erőforrás. A szerkesztők és a megoldások online érhetők el, ha elakad a hibaelhárítási folyamat. Ezen az oldalon kívül ajánlom SPOJ Toolkit и probléma osztályozó SPOJ.pl.

Először is meg kell csiszolnia az alapismereteket

Miután megszokta a nyelv szintaxisát, meg kell oldania néhány problémát. Kezdje egyszerű problémákkal, amelyek gyakorlatot igényelnek. Ebben a szakaszban a fő dolog a programozási stílus meghatározása. Lehet, hogy szeretsz sok szóközt tartalmazó kódot írni, de lehet, hogy nem. Előfordulhat, hogy a zárójeleket ugyanabba a sorba teszi, mint az "if", vagy külön sorokba.

Meg kell találnod a programozási stílusodat, mert ez a TE stílusod.

A keresés során tartson szem előtt két alapelvet:

  • A kódnak könnyen implementálhatónak kell lennie. Kényelmesen érezheti magát az Ön által kitalált megoldás végrehajtása során. Miért? Mert egy verseny alatt az utolsó dolog, amit szeretne, hogy elveszjen a kódjában. Mindig jobb, ha plusz 5 percet tölt a kód végrehajtásának egyszerűsítésén, mint 10 percet a kód kitalálásával.
  • A kódnak könnyen olvashatónak kell lennie. Ha a kód könnyen olvasható, akkor könnyű a hibakeresés. Valljuk be: hibák mindig történnek. Ismered azt az érzést, amikor 10 perc van hátra, és nem találod az átkozott hibát? Hát persze, hogy. Ennek elkerülése érdekében írjon olvasható kódot. Ha elkezdi a hibakeresést, a kód természetesnek és könnyen érthetőnek tűnik.

Itt van egy példa az enyémről programozási stílus.

Hogyan fejlesztheti fejlesztési készségeit

Gyakorlás, gyakorlás és még több gyakorlás. Azt javaslom, hogy dolgozza át az első 250 leginkább megoldható problémát SPOJ. Sorrendben oldja meg őket. Szánjon legalább egy órát mindegyik megoldásának a gondolkodására.

Ne mondd: "Ez a probléma túl nehéz számomra, megpróbálom a következőt." Így gondolkodnak a vesztesek.

Vegyünk egy darab papírt és egy ceruzát. Gondol. Talán találsz megoldást, talán nem. Legalább algoritmikus gondolkodást fejleszt. Ha egy órán belül nem tud megoldást találni, keressen kész megoldást a fórumon vagy a cikkekben.

Mit fog elérni ezzel a megközelítéssel? Tanulja meg, hogyan valósíthatja meg gyorsan ötleteit kóddal. És tanulja meg a klasszikus problémákat és algoritmusokat.

Másodszor, el kell sajátítania az algoritmusokat és az adatstruktúrákat

Kövesse a hierarchikus megközelítést. Elkezdtél úgy futni, hogy nem tudtál járni? Nem. Építhetsz felhőkarcolót szilárd alap nélkül? Ismét nem.

Nem hagyhatja figyelmen kívül a tanulási út szakaszait. Ha figyelmen kívül hagyod őket, tudáshézagok maradnak. Ahogy telik az idő, csak rosszabbak lesznek.

Kezdje az alapvető algoritmusokkal és adatstruktúrákkal

Nehéz elkezdeni. Talán azért, mert nem tudja, mit tanuljon először. Ezért Létrehoztam egy videó tanfolyamot "Algoritmusok és adatstruktúrák". Ennek a kurzusnak a létrehozásakor arra támaszkodtam, hogy hogyan szeretnék tanítani. A válasz hihetetlen volt! Az első hónapban több mint 3000 diák jelentkezett be a kurzusra több mint 100 országból.

Ha a könnyű problémák megoldásán dolgozol, soha nem leszel jobb.

A leghatékonyabb módja annak, hogy rájöjjön, mit nem tud, ha szembesül vele a gyakorlatban. Így tanultam. Sok új technikát tanultam meg, amelyekről korábban soha nem hallottam egy nehéz feladat kiválasztásával.

Minden harmadik probléma, amin dolgozol, megtanít valami újra. Legyen óvatos a problémák kiválasztásával. Válaszd a nehezebb feladatokat!

Miután elvégezte ezt a 250 feladatot az SPOJ-tól, általános ismeretei lesznek a sportprogramozás fő témáiról. Az alapvető algoritmusok logikájának mély megértésével a magas szintű algoritmusok nem tűnnek olyan bonyolultnak. Így tudását maximálisan kamatoztatni tudja.

Mélyebbre ásson az egyes fő témákban

Itt van egy értékes forrás sok információval. Itt minden témakörhöz megtalálja a 10 legjobb algoritmust és adatstruktúrát. A SPOJ 250 problémája után sokat fog tudni ebből a listából. De sok olyan dologba is belebotlik, amiről még soha nem hallott. Tehát kezdje el feltárni ezeket a témákat növekvő sorrendben.

Ha nem erősíted tudásodat, miután valami újat tanultál, gyorsan elfelejtesz mindent.
Azt javaslom, hogy miután megtanult egy új algoritmust, alkalmazza azt a gyakorlatban. Dolgozd ki 2-3 feladatból. Keresse meg az algoritmus címkéjét a SPOJ-ban. Ott talál olyan problémákat, amelyekhez ez az algoritmus szükséges. Először foglalkozzon ezekkel a problémákkal.

Értsd meg a dinamikus programozást, mert győzelemre vezet
Tapasztalataim szerint minden versenyen van legalább egy probléma dinamikus programozás. Sok embernek fáj a feje a „dinamikus programozás” kifejezés hallatán, mert egyáltalán nem értik.

És ez jó. Mert ha értesz a dinamikus programozáshoz, akkor nyersz.

Szeretem a dinamikus programozást, ez a kedvenc témám. A dinamikus programozás titka abban rejlik, hogy globálisan optimális döntéseket hozzunk, ne csak helyieket. A problémát egyszerűbb részfeladatokra kell bontani. Mindegyik részfeladatot csak egyszer oldja meg. Ezután hozzon létre egy megoldást, amely egyesíti a megoldott részproblémákat. Mohó algoritmus a dinamikus programozás ellentéte. Ebben minden lépésnél helyileg optimális választást kell hozni. A lokálisan optimális választás pedig rossz globális megoldáshoz vezethet.

Miközben új fogalmakat fedez fel, nézze meg TopCoder oktatóanyagok. Nagyon részletesek és érthetőek. Nekik köszönhetően meg tudtam érteni binárisan indexelt fák.

keményen dolgozni

Hallottál már olyan sportolókról, akik több éves gyakorlás nélkül nyerik meg az olimpiát? Én nem.

A számítógépes olimpiára való felkészülés minden évben szeptemberben kezdődött és áprilisban ért véget.

Ebben a 8 hónapban minden nap 5 órát gyakoroltam.

És igen, ezt az 5 órát csak algoritmikus feladatok megoldásával töltöttem. Emlékszem azokra a napokra, amikor 8, sőt 10 órát is gyakoroltam. Miért? Mert tetszett. Minden nap, amikor hazatértem az iskolából, egyenesen a hálószobába mentem, leültem a számítógéphez, és új problémát kezdtem el megoldani. Vagy egy új algoritmus megtanulása, amelyet ismerni kellett a probléma megoldásához.

Ha nyerni akarsz, neked is ezt kell tenned. Válassz egy problémát, és maradj mellette. Gondoljon erre, miközben sétál a szupermarket felé vezető úton, vagy vezetés közben.

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

Tudtad, hogy alvás közben az agyad töredezettségmentesíti az aznap gyűjtött információkat? Úgy tűnik, könyveket rakosgat ábécé sorrendben egy könyvespolcon. Lényegében az agyad a különféle problémákra gondol, amelyekkel szembesülsz.

Ezt ügyesen lehet használni. Lefekvés előtt olvass el egy nehéz problémát, és ne feledd, mi kell a megoldásához. Ebben a szakaszban nem kell magát a megoldást keresnie. Menj aludni. Az agyad elkezdi feldolgozni ezt a problémát. Amikor felébredsz, meglepődsz, amikor rájössz, hogy alvás közben találtad meg a megoldást.

Próbáld ki magad. Olyan, mint a varázslat.

Készítettem egy vlogot

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

Ez a rövid bekezdés nem kapcsolódik a sportprogramokhoz. Ha huszonéves, és kíváncsi, hogyan látom a világot, akkor nézheti vlogom a Youtube-on. Beszélek benne a világról, az életről és az informatikáról.

Dolgozz okosan

Ez a siker titka. Célok kellenek.

Emberek vagyunk és szeretjük késlekedik. Mindig el akarjuk halasztani, amit most meg kell tenni. A Netflix nézése mindig élvezetesebb, mint a dinamikus programozási problémák kezelése. Tudod, és meg kell javítanod.

Hogyan győzzük le a halogatást

Tűzz ki célokat magadnak. Mindig találsz érdekes problémákat, amelyekből valami újat tanulhatsz (nézd meg a fent említett forrásokat). De ezeket a problémákat kezelni kell, nem csak olvasni róluk.

Szóval, így győztem le a halogatást. Elindítottam egy papírnaptárat, és minden napot megtöltöttem azokkal a problémákkal, amelyeket meg akartam oldani. A problémákat mindig előre kitöltöttem, két nappal korábban. Így tudtam, hogyan kell beosztani az időmet a következő napokban.

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián

Szóval mindig is motivált voltam. Meg kellett oldanom néhány problémát, és újakat kellett találnom, hogy kitöltsem a naptár következő napjait. A megoldott problémák áthúzása nagyon jó. Tudom, hogy neked is tetszik.

Szerezze be saját papír naptárát. Ne hozzon létre újabb teendők listáját a telefonján, amelyet holnap elfelejt.

Hogyan lehet hatékonyan hibakeresni

Profi szeretne lenni? Ha igen, akkor „elméjében hibakeresést kell végeznie”.
Ez messze a leghatékonyabb hibakeresési technika, amit ismerek, mert egyáltalán nem igényel hibakeresőt. Az agyad a kód több ágát fedezi fel egyszerre, és sokkal szélesebb képet ad a kódról klasszikus hibakereső.

Összehasonlíthatod magad egy nagymesterrel, aki sakkozik és 3 lépést előre gondolkodik.

Ezt a technikát kizárólag kezdeti védelmi vonalként használom. Akkor egy igazi debuggert használok.

Gyakorolni kell ahhoz, hogy megtanuld, hogyan kell „lecsapni az elmédben”. Ha jóváhagyja egy probléma megoldását, és "rossz választ" kap, ne lépjen közvetlenül a hibakereső gombra. Olvassa el újra a kódot, és gondolja át: "Mi történik ebben a sorban?", "Hogyan befolyásolja az "if" itt a programot?", "Ha kilépünk a ciklusból, mi az iterátor értéke?".

Szóval gondolkodj magadon. Idővel megtanulja, hogyan kell kódot írni és útközben hibakeresni.

A szerzőről

Hogyan nyertem 3-ből 4 aranyérmet a számítástechnikai olimpián
Andrei Margeloiu lelkes programozó, akit érdekel a vállalkozás, a startupok és a természet. Felveheti vele a kapcsolatot a LinkedIn-en.

Fordítás: Diana Sheremyeva

Forrás: will.com

Hozzászólás