Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Naghahanda ako para sa Google HashCode World Championship Finals 2017. Ito ang pinakamalaking kumpetisyon na may mga problema sa algorithm na inayos ng Google.

Nagsimula akong mag-aral ng C++ mula sa simula noong ika-siyam na baitang. Wala akong alam tungkol sa programming, algorithm o istruktura ng data. Sa ilang mga punto isinulat ko ang aking unang linya ng code. Pagkalipas ng pitong buwan, ang kumpetisyon sa programming ay nalalapit sa abot-tanaw. Nais kong makita kung gaano kahusay ang aking istilo ng pag-aaral ng programming. Ito ang perpektong pagkakataon.

Pagkatapos ng dalawang araw ng kompetisyon, dumating ang resulta: Nanalo ako ng gintong medalya.

nabigla ako. Nauna ako sa mga katunggali na may 5 taong karanasan. Alam kong nagsumikap ako, ngunit ang tagumpay na ito ay lumampas sa lahat ng aking inaasahan. Napagtanto ko na ang sports programming ay ang aking paksa at sumabay dito.

Alam ko kung ano ang humantong sa akin sa tagumpay at nais kong ibahagi ito sa iyo.

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Ang artikulo ay isinalin sa suporta ng EDISON Software, na pinangangalagaan ang kalusugan ng mga programmer at ang kanilang almusalAt bubuo ng custom na software.

Aling programming language ang pipiliin

  • C++ - Lubos na inirerekomenda! Napakabilis niya. Ang pagpapatupad ng mga algorithm ay tumatagal ng kaunting oras dahil sa STL. Ang C++ ay tinatanggap sa lahat ng kumpetisyon. Isinulat ko ang aking unang linya ng code sa C++.
  • C - Matuto ng C++ dahil sa STL. Kung alam mo ang C, maaari ka ring magprogram sa C++.
  • Ang Java ay isang mabagal na programming language. Mayroon itong Big Integer na klase, ngunit hindi ito makakatulong sa iyo nang malaki. Kung ang isang kumpetisyon ay may limitasyon sa oras, sa Java ay tiyak na malalampasan mo ito. Hindi tinatanggap ang Java sa lahat ng kumpetisyon.

Saan ka makakapagpractice

Nirerekomenda ko Sphere Online Judge (SPOJ). Ito ay isang epektibong mapagkukunan sa mga tuntunin ng dami at kalidad. Available online ang mga editor at solusyon kung natigil ka sa proseso ng paglutas ng mga problema. Bilang karagdagan sa site na ito inirerekumenda ko Toolkit ng SPOJ и classifier ng problema para sa SPOJ.pl.

Una, kailangan mong mahasa ang iyong kaalaman sa mga pangunahing kaalaman

Kapag nasanay ka na sa syntax ng wika, may ilang problemang dapat lampasan. Magsimula sa mga simpleng problema na nangangailangan ng pagsasanay. Sa yugtong ito, ang pangunahing bagay ay upang matukoy ang iyong estilo ng programming. Siguro gusto mong magsulat ng code na may maraming whitespace, marahil ay hindi. Maaaring inilalagay mo ang mga panaklong sa parehong linya ng "kung", o maaaring inilalagay mo ang mga ito sa magkahiwalay na linya.

Kailangan mong hanapin ang iyong programming style dahil ito ang IYONG istilo.

Kapag hinahanap mo ito, tandaan ang dalawang pangunahing prinsipyo:

  • Ang iyong code ay dapat na madaling ipatupad. Dapat kang maging komportable sa pagpapatupad ng solusyon na iyong naisip. Bakit? Dahil sa panahon ng kumpetisyon, ang huling bagay na gusto mo ay mawala sa iyong code. Laging mas mahusay na gumugol ng dagdag na 5 minuto sa pag-iisip tungkol sa kung paano pasimplehin ang pagpapatupad ng code kaysa gumugol ng 10 minuto sa pagsubok na malaman ito.
  • Ang iyong code ay dapat na madaling basahin. Kapag madaling basahin ang code, madaling i-debug. Aminin natin—ang mga bug ay nangyayari sa lahat ng oras. Alam mo yung feeling na may natitira kang 10 minuto at hindi mo mahanap ang mali? Syempre ginagawa mo. Upang maiwasan ang sitwasyong ito, sumulat ng nababasang code. Sa sandaling simulan mo itong i-debug, ang code ay magiging natural at madaling maunawaan.

Narito ang isang halimbawa ko istilo ng programming.

Paano Pagbutihin ang Iyong Mga Kasanayan sa Pag-unlad

Magsanay, magsanay at higit pang pagsasanay. Inirerekomenda ko na gawin mo ang unang 250 pinakanalulusaw na problema sa SPOJ. Lutasin ang mga ito sa pagkakasunud-sunod. Gumugol ng hindi bababa sa isang oras sa pag-iisip tungkol sa solusyon sa bawat isa sa kanila.

Huwag sabihin: "Masyadong mahirap para sa akin ang problemang ito, susubukan kong lutasin ang susunod." Ganito mag-isip ang mga talunan.

Kumuha ng isang piraso ng papel at isang lapis. Pag-isipan mo. Baka makahanap ka ng solusyon, baka hindi. Sa pinakamababa, bubuo ka ng algorithmic na pag-iisip. Kung hindi ka makabuo ng solusyon sa loob ng isang oras, maghanap ng handa na solusyon sa forum o sa mga artikulo.

Ano ang iyong makakamit sa diskarteng ito? Matuto nang mabilis na ipatupad ang iyong mga ideya gamit ang code. At pag-aralan ang mga klasikal na problema at algorithm.

Pangalawa, kailangan mong makabisado ang mga algorithm at istruktura ng data

Sundin ang isang hierarchical na diskarte. Nagsimula ka bang tumakbo nang hindi alam kung paano maglakad? Hindi. Kaya mo bang magtayo ng skyscraper nang walang matibay na pundasyon? Hindi na ulit.

Hindi mo maaaring balewalain ang mga hakbang sa landas ng pag-aaral. Kung papansinin mo ang mga ito, maiiwan ka sa mga gaps ng kaalaman. Sa paglipas ng panahon, sila ay lalala lamang.

Magsimula sa mga pangunahing algorithm at istruktura ng data

Mahirap magsimula. Marahil dahil hindi mo alam kung ano ang una mong pag-aaralan. kaya lang Gumawa ako ng video course na “Algorithms and Data Structures”. Sa paggawa ng kursong ito, ibinatay ko ito sa kung paano ko gustong ituro. Ang reaksyon ay hindi kapani-paniwala! Mahigit 3000 estudyante mula sa mahigit 100 bansa ang nag-sign up para sa kurso sa unang buwan.

Kung magsusumikap ka sa paglutas ng mga madaling problema, hindi ka kailanman mapapabuti.

Ang pinaka-epektibong paraan upang maunawaan ang hindi mo alam ay ang maranasan ito sa pagsasanay. Ganyan ako natuto. Natutunan ko ang maraming mga bagong pamamaraan na hindi ko pa naririnig sa pamamagitan ng pagpili ng isang mapaghamong gawain.

Bawat ikatlong problemang pinagtatrabahuhan mo ay dapat magturo sa iyo ng bago. Maging mas maingat sa pagpili ng mga problema. Pumili ng mas mahirap na problema!

Kapag nakumpleto mo na ang 250 problemang ito mula sa SPOJ, magkakaroon ka ng pangunahing pag-unawa sa mga pangunahing paksa ng sports programming. Sa malalim na pag-unawa sa lohika sa likod ng mga pangunahing algorithm, ang mga high-level na algorithm ay magmumukhang hindi gaanong kumplikado. Sa ganitong paraan masusulit mo ang iyong kaalaman.

Maghukay ng mas malalim sa bawat isa sa mga pangunahing tema

Narito ang isang mahalagang mapagkukunan na may maraming impormasyon. Doon ay makikita mo ang nangungunang 10 algorithm at istruktura ng data para sa bawat paksa. Pagkatapos ng 250 problema mula sa SPOJ, marami kang malalaman mula sa listahang ito. Ngunit madadapa ka rin sa maraming bagay na hindi mo pa naririnig. Kaya simulan ang pag-aaral ng mga paksang ito sa pataas na pagkakasunud-sunod.

Kung hindi mo palalakasin ang iyong kaalaman pagkatapos matuto ng bago, mabilis mong makakalimutan ang lahat.
Inirerekomenda ko na pagkatapos mong matuto ng bagong algorithm, gamitin ito sa pagsasanay. Gawin ito sa pamamagitan ng 2-3 gawain. Hanapin ang algorithm tag sa SPOJ. Doon ay makakahanap ka ng mga problema na nangangailangan ng algorithm na ito upang malutas. Tugunan muna ang mga isyung ito.

Master Dynamic Programming Dahil Dadalhin Ka Nito sa Tagumpay
Mula sa aking karanasan, bawat kumpetisyon ay may kahit isang problema dynamic na programming. Sumasakit ang ulo ng maraming tao kapag naririnig nila ang pariralang “dynamic programming” dahil hindi nila ito naiintindihan.

At ito ay mabuti. Dahil kung naiintindihan mo ang dynamic na programming, pagkatapos ay mananalo ka.

Gusto ko ang dynamic na programming, ito ang paborito kong paksa. Ang sikreto ng dynamic na programming ay ang paggawa ng pinakamainam na pagpipilian sa buong mundo, hindi lamang ang mga lokal. Dapat mong hatiin ang problema sa mas simpleng mga sub-problema. Lutasin ang bawat isa sa mga subproblemang ito nang isang beses lamang. Pagkatapos ay lumikha ng isang solusyon na pinagsasama ang nalutas na mga subproblema. Sakim na algorithm - ang kabaligtaran ng dynamic na programming. Nangangailangan ito ng paggawa ng mga lokal na pinakamainam na pagpipilian sa bawat hakbang. At ang lokal na pinakamainam na pagpipilian ay maaaring humantong sa isang masamang pandaigdigang solusyon.

Habang nag-aaral ng mga bagong konsepto, tingnan Mga tutorial sa TopCoder. Ang mga ito ay napaka detalyado at naiintindihan. Salamat sa kanila naintindihan ko binary index na mga puno.

Magsikap

Narinig mo na ba ang mga atleta na nanalo sa Olympics nang walang mga taon ng pagsasanay? hindi ako.

Taun-taon, nagsimula ang paghahanda para sa Computer Olympiad noong Setyembre at natapos noong Abril.

Araw-araw sa loob ng 8 buwang ito ay nagsasanay ako ng 5 oras.

At oo, ginugol ko ang 5 oras na ito sa paglutas lamang ng mga problema sa algorithm. Naaalala ko ang mga araw na nagsasanay ako ng 8 at kahit 10 oras. Bakit? Dahil nagustuhan ko. Araw-araw pag-uwi ko mula sa paaralan, dumiretso ako sa kwarto, umupo sa computer at nagsimulang mag-analyze ng bagong problema. O nag-aaral ako ng bagong algorithm na kailangan kong malaman para malutas ang problemang ito.

Kung gusto mong manalo, kailangan mong gawin ang parehong. Pumili ng isang problema at manatili dito. Isipin ito habang naglalakad papunta sa supermarket o habang nagmamaneho.

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Alam mo ba na kapag natutulog ka, defragment ng iyong utak ang impormasyong nakolekta noong araw na iyon? Mukhang nagsasalansan siya ng mga libro sa alpabetikong pagkakasunud-sunod sa isang bookshelf. Sa esensya, iniisip ng iyong utak ang tungkol sa iba't ibang problemang kinakaharap mo.

Magagamit ito nang may kasanayan. Bago matulog, basahin ang isang mahirap na problema at tandaan kung ano ang kinakailangan upang malutas ito. Sa yugtong ito, hindi mo kailangang hanapin ang solusyon mismo. Matulog ka na. Magsisimulang iproseso ng iyong utak ang problemang ito. Kapag nagising ka, magugulat kang mapagtanto na natagpuan mo ang solusyon habang ikaw ay natutulog.

Subukan ito sa iyong sarili. Parang magic.

Gumawa ako ng video blog

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Ang maikling talatang ito ay hindi nauugnay sa sports programming. Kung ikaw ay nasa twenties at nagtataka kung paano ko nakikita ang mundo, baka gusto mong tingnan ang aking video blog sa Youtube. Pinag-uusapan ko ang mundo, buhay at computer science dito.

Magtrabaho nang matalino

Ito ang sikreto ng tagumpay. Kailangan mo ng mga layunin.

Tao tayo at gusto natin ito pagpapaliban. Gusto naming laging ipagpaliban ang mga dapat gawin ngayon. Ang panonood ng Netflix ay palaging mas kasiya-siya kaysa sa pagharap sa mga dynamic na problema sa programming. Alam mo ito at kailangan mong ayusin ito.

Paano talunin ang procrastination

Itakda ang iyong sarili ng mga layunin. Palagi kang makakahanap ng mga kawili-wiling problema kung saan maaari kang matuto ng bago (tingnan ang mga mapagkukunang nabanggit ko sa itaas). Ngunit ang mga problemang ito ay kailangang lutasin, hindi lamang basahin.

Kaya narito kung paano ko nalampasan ang pagpapaliban. Nagsimula ako ng isang kalendaryong papel at pinupuno ang bawat araw ng mga problemang gusto kong lutasin. Palagi kong pinupunan ang mga problema dalawang araw nang maaga. Kaya alam ko kung paano pamahalaan ang aking oras sa mga susunod na araw.

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad

Kaya lagi akong na-motivate. Kailangan kong lutasin ang ilang mga problema at maghanap ng mga bago upang punan ang mga susunod na araw sa kalendaryo. Masarap sa pakiramdam ang pagtawid sa mga nalutas na problema. Alam kong gusto mo rin.

Kumuha ng sarili mong kalendaryong papel. Huwag gumawa ng isa pang listahan ng gagawin sa iyong telepono na makakalimutan mo bukas.

Paano mabisang mag-debug

Gusto mo bang maging isang propesyonal? Kung oo, kailangan mong "i-debug ito sa iyong isip."
Ito ang pinakamabisang pamamaraan sa pag-debug na alam ko dahil hindi ito nangangailangan ng debugger. Sinusuri ng iyong utak ang maraming sangay ng code nang sabay-sabay at binibigyan ka ng mas malawak na pangkalahatang-ideya ng code kumpara sa klasikong debugger.

Maaari mong ihambing ang iyong sarili sa isang grandmaster na naglalaro ng chess at nag-iisip ng 3 hakbang sa unahan.

Ginagamit ko lang ang diskarteng ito bilang aking unang linya ng depensa. Pagkatapos ay gumagamit ako ng isang tunay na debugger.

Upang matutunan kung paano mag-debug sa iyong ulo, kailangan mong magsanay. Kapag na-validate mo ang isang solusyon sa isang problema at nakakuha ka ng "maling sagot", huwag dumiretso sa debugger button. Basahin muli ang code at isipin: "Ano ang nangyayari sa linyang ito?", "Paano nakakaapekto ang "kung" dito sa programa?", "Kapag lumabas tayo sa loop, ano ang halaga ng iterator?"

Sa ganitong paraan mag-isip ka para sa iyong sarili. Sa paglipas ng panahon, matututunan mong magsulat ng code at i-debug ito sa mabilisang.

Tungkol sa May-akda

Kung paano ako nanalo ng 3 sa 4 na gintong medalya sa Computing Olympiad
Si Andrei Margeloiu ay isang masugid na programmer na may interes sa entrepreneurship, mga startup, at sa labas. Maaari mo siyang kontakin sa LinkedIn.

Pagsasalin: Diana Sheremyeva

Pinagmulan: www.habr.com

Magdagdag ng komento