Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Ruošiausi Google HashCode World Championship Finals 2017. Tai didžiausias Google organizuojamas konkursas su algoritminėmis problemomis.

C++ pradėjau mokytis nuo nulio devintoje klasėje. Nieko nežinojau apie programavimą, algoritmus ar duomenų struktūras. Kažkuriuo momentu parašiau pirmąją kodo eilutę. Po septynių mėnesių horizonte pasirodė programavimo konkursas. Norėjau pamatyti, kaip gerai veikia mano mokymosi programavimo stilius. Tai buvo puiki galimybė.

Po dviejų dienų varžybų atėjo rezultatai: laimėjau aukso medalį.

Aš buvau šokiruotas. Aplenkiau konkurentus, turinčius 5 metų patirtį. Žinojau, kad sunkiai dirbau, bet šis pasiekimas pranoko visus mano lūkesčius. Supratau, kad sporto programavimas yra mano tema ir stačia galva į ją įsitraukiau.

Žinau, kas atvedė mane į sėkmę, ir noriu tuo pasidalinti su jumis.

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Straipsnis buvo išverstas su EDISON Software pagalba, kuri rūpinasi programuotojų sveikata ir jų pusryčiaisIr kuria individualią programinę įrangą.

Kokią programavimo kalbą pasirinkti

  • C++ – labai rekomenduoju! Jis labai greitas. Algoritmų įgyvendinimas užtrunka mažai laiko dėl STL. C++ yra priimamas visuose konkursuose. Pirmąją kodo eilutę parašiau C++.
  • C – išmokite C++ dėl STL. Jei mokate C, galite programuoti ir C++.
  • Java yra lėta programavimo kalba. Jame yra „Big Integer“ klasė, bet tai jums nelabai padės. Jei konkursas turi laiko limitą, su Java tikrai jį viršysite. Java nepriimama visuose konkursuose.

Kur galima praktikuotis

Aš rekomenduoju „Sphere Online Judge“ (SPOJ). Tai efektyvus išteklius kiekybės ir kokybės atžvilgiu. Redaktoriai ir sprendimai pasiekiami internete, jei įstringate problemų sprendimo procese. Be šios svetainės aš rekomenduoju SPOJ įrankių rinkinys и problemų klasifikatorius, skirtas SPOJ.pl.

Pirmiausia turite patobulinti savo žinias apie pagrindus

Kai pripranti prie kalbos sintaksės, reikia įveikti keletą problemų. Pradėkite nuo paprastų problemų, kurioms reikia praktikos. Šiame etape svarbiausia nustatyti savo programavimo stilių. Galbūt jums patinka rašyti kodą su daug tarpų, o gal ne. Gali būti, kad skliaustus dedate toje pačioje eilutėje kaip ir „jei“ arba galite juos sudėti į atskiras eilutes.

Turite rasti savo programavimo stilių, nes tai TAVO stilius.

Kai ieškote, atsiminkite du pagrindinius principus:

  • Jūsų kodas turėtų būti lengvai įgyvendinamas. Turėtumėte jaustis patogiai įgyvendindami sugalvotą sprendimą. Kodėl? Nes per konkursą paskutinis dalykas, kurio norite, yra pasiklysti savo kode. Visada geriau skirti papildomas 5 minutes galvojimui, kaip supaprastinti kodo įgyvendinimą, nei skirti 10 minučių bandant jį išsiaiškinti.
  • Jūsų kodas turėtų būti lengvai skaitomas. Kai kodą lengva skaityti, jį lengva derinti. Pripažinkime – klaidų pasitaiko nuolat. Žinote tą jausmą, kai lieka 10 minučių ir negalite rasti prakeiktos klaidos? Žinoma, jūs darote. Norėdami išvengti šios situacijos, parašykite įskaitomą kodą. Kai tik pradėsite jį derinti, kodas atrodys natūralus ir lengvai suprantamas.

Štai mano pavyzdys programavimo stilius.

Kaip tobulinti savo tobulėjimo įgūdžius

Praktika, praktika ir dar daugiau praktikos. Rekomenduoju išspręsti pirmąsias 250 labiausiai išsprendžiamų problemų SPOJ. Išspręskite juos eilės tvarka. Praleiskite bent valandą galvodami apie kiekvieno iš jų sprendimą.

Nesakykite: „Ši problema man per sunki, pabandysiu išspręsti kitą“. Taip galvoja nevykėliai.

Paimkite popieriaus lapą ir pieštuką. Pagalvok apie tai. Galbūt rasite sprendimą, o gal ne. Bent jau lavinsite algoritminį mąstymą. Jei negalite rasti sprendimo per valandą, ieškokite paruošto sprendimo forume arba straipsniuose.

Ką pasieksite šiuo metodu? Išmokite greitai įgyvendinti savo idėjas naudodami kodą. Ir studijuoti klasikines problemas bei algoritmus.

Antra, turite įvaldyti algoritmus ir duomenų struktūras

Laikykitės hierarchinio požiūrio. Ar pradėjote bėgioti nemokėdami vaikščioti? Nr. Ar galite pastatyti dangoraižį be tvirto pagrindo? Tik ne vėl.

Jūs negalite ignoruoti žingsnių mokymosi kelyje. Jei jų nepaisysite, liksite žinių spragų. Laikui bėgant jie tik pablogės.

Pradėkite nuo pagrindinių algoritmų ir duomenų struktūrų

Sunku pradėti. Galbūt todėl, kad nežinote, ką pirmiausia studijuoti. Štai kodėl Sukūriau video kursą „Algoritmai ir duomenų struktūros“. Kurdama šį kursą rėmiausi tuo, kaip norėčiau, kad mane mokytų. Reakcija buvo neįtikėtina! Per pirmąjį mėnesį į kursus užsiregistravo daugiau nei 3000 studentų iš daugiau nei 100 šalių.

Jei stengsitės išspręsti lengvas problemas, niekada nepagerėsite.

Veiksmingiausias būdas suprasti tai, ko nežinai, yra tai patirti praktiškai. Taip ir išmokau. Pasirinkęs sudėtingą užduotį išmokau daug naujų technikų, apie kurias dar nebuvau girdėjęs.

Kas trečia problema, su kuria dirbate, turėtų jus išmokyti kažko naujo. Būkite atsargesni rinkdamiesi problemas. Pasirinkite sudėtingesnes problemas!

Atlikę šias 250 SPOJ užduočių, turėsite pagrindinį supratimą apie pagrindines sporto programavimo temas. Giliai supratus pagrindinių algoritmų logiką, aukšto lygio algoritmai atrodys ne tokie sudėtingi. Taip galite maksimaliai išnaudoti savo žinias.

Gilinkitės į kiekvieną pagrindinę temą

Čia yra vertingas šaltinis su daugybe informacijos. Ten rasite 10 geriausių algoritmų ir duomenų struktūrų kiekvienai temai. Po 250 problemų iš SPOJ daug sužinosite iš šio sąrašo. Tačiau jūs taip pat suklups daug dalykų, apie kuriuos anksčiau negirdėjote. Taigi pradėkite studijuoti šias temas didėjančia tvarka.

Jei išmokęs ką nors naujo nesustiprinsi žinių, greitai viską pamirš.
Rekomenduoju išmokus naują algoritmą panaudoti jį praktiškai. Atlikite 2–3 užduotis. Algoritmo žymos ieškokite SPOJ. Ten rasite problemų, kurioms išspręsti reikia šio algoritmo. Pirmiausia spręskite šias problemas.

Įvaldykite dinaminį programavimą, nes jis nuves jus į pergalę
Mano patirtis rodo, kad kiekvienas konkursas turi bent vieną problemą dinaminis programavimas. Daugeliui žmonių skauda galvą, kai išgirsta frazę „dinaminis programavimas“, nes jie to visiškai nesupranta.

Ir tai yra gerai. Nes jei suprasi dinaminį programavimą, tai laimėsi.

Man patinka dinaminis programavimas, tai mano mėgstamiausia tema. Dinaminio programavimo paslaptis – priimti globaliai optimalius, o ne tik vietinius pasirinkimus. Turite suskirstyti problemą į paprastesnes dalis. Kiekvieną iš šių subproblemų išspręskite tik vieną kartą. Tada sukurkite sprendimą, apjungiantį išspręstas subproblemas. Godus algoritmas – dinaminio programavimo priešingybė. Kiekviename etape reikia pasirinkti optimalius vietinius sprendimus. O lokaliai optimalus pasirinkimas gali lemti blogą visuotinį sprendimą.

Mokydamiesi naujų sąvokų, patikrinkite TopCoder vadovėliai. Jie yra labai išsamūs ir suprantami. Jų dėka aš galėjau suprasti dvejetainiai indeksuoti medžiai.

Sunkiai dirbti

Ar kada nors girdėjote apie sportininkus, kurie laimi olimpines žaidynes be ilgų treniruočių? Aš ne.

Kiekvienais metais pasiruošimas kompiuterių olimpiadai prasidėdavo rugsėjį ir baigdavosi balandžio mėnesį.

Šiuos 8 mėnesius kasdien mankštinuosi po 5 valandas.

Ir taip, šias 5 valandas praleidau tik sprendžiant algoritmines problemas. Prisimenu laikus, kai mankštindavausi po 8 ir net 10 valandų. Kodėl? Nes man patiko. Kiekvieną dieną, kai grįždavau namo iš mokyklos, eidavau tiesiai į miegamąjį, sėsdavau prie kompiuterio ir pradėdavau analizuoti naują problemą. Arba mokiausi naujo algoritmo, kurį turėjau žinoti, kad išspręsčiau šią problemą.

Jei nori laimėti, turi daryti tą patį. Pasirinkite problemą ir laikykitės jos. Pagalvokite apie tai eidami į prekybos centrą ar vairuodami.

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Ar žinojote, kad miegant jūsų smegenys defragmentuoja tą dieną surinktą informaciją? Atrodo, kad jis knygų lentynoje krauna knygas abėcėlės tvarka. Iš esmės jūsų smegenys galvoja apie įvairias problemas, su kuriomis susiduriate.

Tai gali būti sumaniai panaudota. Prieš eidami miegoti perskaitykite sunkią problemą ir prisiminkite, ko reikia norint ją išspręsti. Šiame etape nereikia ieškoti paties sprendimo. Eik į lovą. Jūsų smegenys pradės spręsti šią problemą. Pabudę nustebsite supratę, kad sprendimą radote miegodami.

Išbandykite patys. Tai tarsi magija.

Sukūriau video dienoraštį

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Ši trumpa pastraipa nesusijusi su sporto programavimu. Jei jums dvidešimt ir įdomu, kaip aš matau pasaulį, galbūt norėsite pasižiūrėti mano video dienoraštis Youtube. Jame kalbu apie pasaulį, gyvenimą ir informatiką.

Dirbk protingai

Tai sėkmės paslaptis. Jums reikia tikslų.

Mes esame žmonės ir mums tai patinka atidėlioti. Mes visada norime atidėti tai, ką reikia padaryti dabar. Žiūrėti „Netflix“ visada yra maloniau nei spręsti dinaminio programavimo problemas. Jūs tai žinote ir turite tai ištaisyti.

Kaip įveikti vilkinimą

Išsikelk sau tikslus. Visada rasite įdomių problemų, iš kurių galėsite išmokti ko nors naujo (peržiūrėkite anksčiau minėtus išteklius). Tačiau šias problemas reikia išspręsti, o ne tik skaityti.

Taigi štai kaip aš įveikiau vilkinimą. Pradėjau kurti popierinį kalendorių ir kiekvieną dieną užpildžiau problemomis, kurias norėjau išspręsti. Aš visada užpildžiau problemas prieš dvi dienas. Taigi aš žinojau, kaip valdyti savo laiką sekančiomis dienomis.

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4

Taigi aš visada buvau motyvuotas. Man reikėjo išspręsti kai kurias problemas ir rasti naujų, kad užpildytų kitas dienas kalendoriuje. Išspręstų problemų perbraukimas jaučiasi puikiai. Žinau, kad tau taip pat patinka.

Gaukite savo popierinį kalendorių. Nekurkite savo telefone kito darbų sąrašo, kurį rytoj pamiršite.

Kaip efektyviai derinti

Ar norite tapti profesionalu? Jei taip, tuomet reikia „derinti tai mintyse“.
Tai pats efektyviausias mano žinomas derinimo būdas, nes tam visai nereikia derinimo. Jūsų smegenys vienu metu tiria kelias kodo šakas ir suteikia daug platesnę kodo apžvalgą, palyginti su klasikinis derintuvas.

Galite palyginti save su didmeistriu, kuris žaidžia šachmatais ir galvoja 3 ėjimus į priekį.

Šią techniką naudoju tik kaip pradinę gynybos liniją. Tada naudoju tikrą derintuvą.

Norėdami išmokti derinti savo galvoje, turite pasitreniruoti. Kai patvirtinate problemos sprendimą ir gaunate „neteisingą atsakymą“, neikite tiesiai į derinimo mygtuką. Dar kartą perskaitykite kodą ir pagalvokite: „Kas vyksta šioje eilutėje?“, „Kaip „jei“ čia veikia programą?“, „Kai išeiname iš ciklo, kokia yra iteratoriaus reikšmė?

Tokiu būdu jūs galvojate patys. Laikui bėgant išmoksite rašyti kodą ir jį derinti.

Apie Autorius:

Kaip kompiuterijos olimpiadoje laimėjau 3 aukso medalius iš 4
Andrejus Margeloiu yra aistringas programuotojas, besidomintis verslumu, startuoliais ir gamta. Galite susisiekti su juo „LinkedIn“..

Vertimas: Diana Šeremyeva

Šaltinis: www.habr.com

Добавить комментарий