Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

Mi prepariĝis por la Google HashCode World Championship Finals 2017. Ĉi tiu estas la plej granda konkurso kun algoritmaj problemoj organizitaj de Guglo.

Mi eklernis C++ de nulo en naŭa klaso. Mi sciis nenion pri programado, algoritmoj aŭ datumstrukturoj. Iam mi skribis mian unuan linion de kodo. Sep monatojn poste, la programa konkurso minacis ĉe la horizonto. Mi volis vidi kiom bone funkcias mia stilo de lernprogramado. Ĝi estis la perfekta ŝanco.

Post du tagoj da konkurso venis la rezultoj: mi gajnis la oran medalon.

Mi estis ŝokita. Mi estis antaŭ konkurantoj kun 5-jara sperto. Mi sciis, ke mi multe laboris, sed ĉi tiu atingo superis ĉiujn miajn atendojn. Mi konstatis, ke sporta programado estas mia temo kaj plonĝis en ĝin kape.

Mi scias, kio kondukis min al sukceso kaj mi volas dividi ĝin kun vi.

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

La artikolo estis tradukita kun la subteno de EDISON Software, kiu prizorgas la sanon de programistoj kaj ilian matenmanĝonKaj disvolvas laŭmendan programaron.

Kiun programlingvon elekti

  • C++ - Tre rekomendas! Li estas tre rapida. Efektivigo de algoritmoj prenas malmultan tempon pro STL. C++ estas akceptita en ĉiuj konkursoj. Mi skribis mian unuan linion de kodo en C++.
  • C - Lernu C++ pro la STL. Se vi konas C, vi ankaŭ povas programi en C++.
  • Java estas malrapida programlingvo. Ĝi havas Grandan Entjeran klason, sed ĝi ne multe helpos vin. Se konkurso havas tempolimon, per Java vi certe superos ĝin. Java ne estas akceptita ĉe ĉiuj konkursoj.

Kie vi povas ekzerci

mi rekomendas Sfera Reta Juĝisto (SPOJ). Ĝi estas efika rimedo laŭ kvanto kaj kvalito. Redaktoroj kaj solvoj haveblas interrete se vi blokiĝas en la procezo de solvado de problemoj. Krom ĉi tiu retejo mi rekomendas Ilaro de SPOJ и problemklasigilo por SPOJ.pl.

Unue, vi devas plibonigi vian scion pri la bazaĵoj

Kiam vi alkutimiĝas al la sintakso de la lingvo, estas iuj problemoj por venki. Komencu kun simplaj problemoj, kiuj postulas praktikon. En ĉi tiu etapo, la ĉefa afero estas determini vian programstilon. Eble vi ŝatas skribi kodon kun multe da blankspaco, eble vi ne ŝatas. Vi eble metas la krampojn sur la saman linion kiel la "se", aŭ vi povas meti ilin sur apartajn liniojn.

Vi devas trovi vian programstilon ĉar ĝi estas VIA stilo.

Kiam vi serĉas ĝin, memoru du bazajn principojn:

  • Via kodo devus esti facile efektivigebla. Vi devus senti vin komforta efektivigante la solvon, kiun vi elpensas. Kial? Ĉar dum konkurso, la lasta afero, kiun vi volas, estas perdiĝi en via kodo. Ĉiam pli bone estas pasigi pliajn 5 minutojn pensante pri kiel simpligi la efektivigon de la kodo ol pasigi 10 minutojn por eltrovi ĝin.
  • Via kodo devus esti facile legebla. Kiam kodo estas facile legebla, ĝi estas facile sencimigi. Ni alfrontu ĝin — cimoj okazas la tutan tempon. Ĉu vi konas tiun senton kiam vi restas 10 minutoj kaj vi ne povas trovi la malbenitan eraron? Kompreneble vi faras. Por eviti ĉi tiun situacion, skribu legeblan kodon. Post kiam vi komencas sencimigi ĝin, la kodo ŝajnos natura kaj facile komprenebla.

Jen ekzemplo mia programa stilo.

Kiel Plibonigi Viajn Disvolvajn Kapablojn

Praktiku, praktiko kaj pli praktiko. Mi rekomendas, ke vi prilaboru la unuajn 250 plej solveblajn problemojn SPOJ. Solvu ilin en ordo. Pasigu almenaŭ unu horon pensante pri la solvo de ĉiu el ili.

Ne diru: "Ĉi tiu problemo estas tro malfacila por mi, mi provos solvi la sekvan." Tiel pensas perdantoj.

Prenu pecon da papero kaj krajonon. Pensu pri ĝi. Eble vi povas trovi solvon, eble ne. Minimume, vi disvolvos algoritman pensadon. Se vi ne povas elpensi solvon ene de unu horo, serĉu pretan solvon en la forumo aŭ en artikoloj.

Kion vi atingos per ĉi tiu aliro? Lernu rapide efektivigi viajn ideojn per kodo. Kaj studu klasikajn problemojn kaj algoritmojn.

Due, vi devas regi algoritmojn kaj datumstrukturojn

Sekvu hierarkian aliron. Ĉu vi ekkuris sen scii marŝi? Ne. Ĉu vi povas konstrui nubskrapulon sen solida fundamento? Ne denove.

Vi ne povas ignori la paŝojn laŭ la lernado. Se vi ignoras ilin, vi restos kun scio-mankoj. Kun la tempo ili nur plimalboniĝos.

Komencu per fundamentaj algoritmoj kaj datumstrukturoj

Estas malfacile komenci. Eble ĉar vi ne scias kion studi unue. Tial Mi kreis videokurson "Algoritmoj kaj Datumaj Strukturoj". Kreante ĉi tiun kurson, mi bazigis ĝin sur kiel mi ŝatus esti instruata. La reago estis nekredebla! Pli ol 3000 studentoj el pli ol 100 landoj aliĝis al la kurso en la unua monato.

Se vi laboras por solvi facilajn problemojn, vi neniam pliboniĝos.

La plej efika maniero kompreni tion, kion vi ne scias, estas sperti ĝin praktike. Tiel mi lernis. Mi lernis multajn novajn teknikojn, pri kiuj mi neniam antaŭe aŭdis, elektante defian taskon.

Ĉiu tria problemo, pri kiu vi laboras, devus instrui al vi ion novan. Estu pli singarda kiam vi elektas problemojn. Elektu pli malfacilajn problemojn!

Post kiam vi kompletigos ĉi tiujn 250 problemojn de SPOJ, vi havos bazan komprenon pri la kernaj temoj de sporta programado. Kun profunda kompreno de la logiko malantaŭ bazaj algoritmoj, altnivelaj algoritmoj ŝajnos malpli kompleksaj. Tiel vi povas profiti la plej grandan parton de via scio.

Fosu pli profunde en ĉiun el la ĉefaj temoj

Jen valora rimedo kun multe da informoj. Tie vi trovos la plej bonajn 10 algoritmojn kaj datumstrukturojn por ĉiu temo. Post 250 problemoj de SPOJ, vi scios multon el ĉi tiu listo. Sed vi ankaŭ trovos multajn aferojn, pri kiuj vi neniam antaŭe aŭdis. Do komencu studi ĉi tiujn temojn en kreskanta ordo.

Se vi ne plifortigas viajn sciojn post lerni ion novan, vi rapide forgesos ĉion.
Mi rekomendas, ke post kiam vi lernas novan algoritmon, uzu ĝin praktike. Laboru ĝin per 2-3 taskoj. Serĉu la algoritmo-etikedon en SPOJ. Tie vi trovos problemojn, kiuj bezonas ĉi tiun algoritmon por solvi. Pritraktu ĉi tiujn aferojn unue.

Majstra Dinamika Programado Ĉar Ĝi kondukos Vin al Venko
Laŭ mia sperto, ĉiu konkurso havas almenaŭ unu problemon dinamika programado. Multaj homoj kapdoloras kiam ili aŭdas la frazon “dinamika programado” ĉar ili tute ne komprenas ĝin.

Kaj ĉi tio estas bona. Ĉar se vi komprenas dinamikan programadon, tiam vi venkos.

Mi ŝatas dinamikan programadon, ĝi estas mia plej ŝatata temo. La sekreto de dinamika programado estas fari tutmonde optimumajn elektojn, ne nur lokajn. Vi devas dividi la problemon en pli simplajn subproblemojn. Solvu ĉiun el ĉi tiuj subproblemoj nur unufoje. Poste kreu solvon, kiu kombinas la solvitajn subproblemojn. Avida algoritmo - la malo de dinamika programado. Ĝi postulas fari loke optimumajn elektojn ĉe ĉiu paŝo. Kaj loke optimuma elekto povas konduki al malbona tutmonda solvo.

Dum lernado de novaj konceptoj, kontrolu TopCoder lerniloj. Ili estas tre detalaj kaj kompreneblaj. Dank' al ili mi povis kompreni binaraj indeksitaj arboj.

Laboregas

Ĉu vi iam aŭdis pri atletoj, kiuj gajnas la Olimpikojn sen jaroj da ekzercado? Mi ne.

Ĉiujare, preparoj por la Komputila Olimpiko komenciĝis en septembro kaj finiĝis en aprilo.

Ĉiutage dum ĉi tiuj 8 monatoj mi ekzercis dum 5 horoj.

Kaj jes, mi pasigis ĉi tiujn 5 horojn nur solvante algoritmajn problemojn. Mi memoras la tagojn, kiam mi ekzercis dum 8 kaj eĉ 10 horoj. Kial? Ĉar mi ŝatis ĝin. Ĉiutage, kiam mi revenis hejmen de la lernejo, mi iris rekte al la dormoĉambro, sidiĝis ĉe la komputilo kaj komencis analizi novan problemon. Aŭ mi estis lernanta novan algoritmon, kiun mi bezonis scii por solvi ĉi tiun problemon.

Se vi volas gajni, vi devas fari la samon. Elektu problemon kaj restu al ĝi. Pensu pri tio dum marŝado al la superbazaro aŭ dum veturado.

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

Ĉu vi sciis, ke kiam vi dormas, via cerbo malfragmentas la informojn kolektitajn tiun tagon? Li ŝajnas stakigi librojn en alfabeta sinsekvo sur librobreto. Esence, via cerbo pensas pri la diversaj problemoj, kiujn vi alfrontas.

Ĉi tio povas esti uzata lerte. Antaŭ enlitiĝi, legu malfacilan problemon kaj memoru, kion necesas por solvi ĝin. En ĉi tiu etapo, vi ne bezonas serĉi la solvon mem. Enlitiĝi. Via cerbo komencos prilabori ĉi tiun problemon. Kiam vi vekiĝos, vi surprizos rimarki, ke vi trovis la solvon dum vi dormis.

Provu ĝin mem. Estas kiel magio.

Mi kreis videoblogon

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

Ĉi tiu mallonga alineo ne rilatas al sporta programado. Se vi estas dudekjara kaj scivolas kiel mi vidas la mondon, vi eble volas kontroli mia videoblogo ĉe Youtube. Mi parolas pri la mondo, vivo kaj komputiko en ĝi.

Laboru inteligente

Ĉi tio estas la sekreto de sukceso. Vi bezonas celojn.

Ni estas homoj kaj ni ŝatas ĝin prokrasti. Ni ĉiam volas prokrasti tion, kion oni devas fari nun. Rigardi Netflix estas ĉiam pli agrabla ol trakti dinamikajn programajn problemojn. Vi scias ĉi tion kaj vi devas ripari ĝin.

Kiel venki prokrastinon

Fiksu al vi celojn. Vi ĉiam trovos interesajn problemojn, el kiuj vi povas lerni ion novan (kontrolu la rimedojn, kiujn mi supre menciis). Sed ĉi tiuj problemoj devas esti solvitaj, ne nur legi pri tio.

Do jen kiel mi venkis prokrastadon. Mi komencis paperan kalendaron kaj plenigis ĉiun tagon per problemoj, kiujn mi volis solvi. Mi ĉiam plenigis problemojn du tagojn antaŭe. Do mi sciis kiel administri mian tempon en la sekvaj tagoj.

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko

Do mi ĉiam estis motivita. Mi bezonis solvi kelkajn problemojn kaj trovi novajn por plenigi la sekvajn tagojn en la kalendaro. Forstreki solvitajn problemojn sentas sin bonege. Mi scias, ke ankaŭ vi ŝatas ĝin.

Akiru vian propran paperan kalendaron. Ne kreu alian faroliston en via telefono, pri kiu vi forgesos morgaŭ.

Kiel sencimigi efike

Ĉu vi volas fariĝi profesia? Se jes, tiam vi devas "sencimi ĝin en via menso."
Ĉi tio estas senkompare la plej efika sencimiga tekniko, kiun mi konas, ĉar ĝi tute ne postulas erarserĉilon. Via cerbo ekzamenas plurajn kodbranĉojn samtempe kaj donas al vi multe pli larĝan superrigardon de la kodo kompare kun klasika erarserĉilo.

Vi povas kompari vin kun grandmajstro, kiu ludas ŝakon kaj opinias 3 movojn antaŭen.

Mi uzas ĉi tiun teknikon nur kiel mian komencan defendan linion. Tiam mi uzas veran erarserĉilon.

Por lerni kiel sencimigi en via kapo, vi devas ekzerci. Kiam vi validigas solvon de problemo kaj ricevas "malĝustan respondon", ne iru rekte al la butono de la sencimigilo. Relegu la kodon kaj pensu: "Kio okazas en ĉi tiu linio?", "Kiel la "se" ĉi tie influas la programon?", "Kiam ni eliras la buklon, kio estas la valoro de la iteratoro?"

Tiel vi mem pensas. Kun la tempo, vi lernos skribi kodon kaj sencimigi ĝin sur la flugo.

Pri la aŭtoro

Kiel mi gajnis 3 el 4 orajn medalojn ĉe la Komputika Olimpiko
Andrei Margeloiu estas fervora programisto kun intereso pri entreprenado, noventreprenoj kaj eksterdomoj. Vi povas kontakti lin sur LinkedIn.

Traduko: Diana Ŝeremieva

fonto: www.habr.com

Aldoni komenton