Sijoituin tämän vuoden datatähdessä sijalle 17, joka riittää siihen, että pääsen tammi-helmikuussa mukaan loppukilpailuun. Loppukilpailun 10 parasta pääsee suoraan opiskelemaan tekniikkaa ja matemaattis-luonnontieteellisiä aineita useimpiin Suomen yliopistoihin, joka on itselleni suuri motivoija.
Ajattelin ainakin tehdä mahdollisimman paljon noita datatähden harjoitustehtäviä, mutta kysyisinkin taitavammilta vinkkejä, miten tämä 3 kuukautta ennen loppukisaa kannattaisi hyödyntää? Entä uskotteko minulla olevan mahdollisuuksia päästä 10 parhaan joukkoon? Kisan kärki taitaa olla melkoisia konkareita.
Tärkeä vinkki on, että kannattaa harjoitella. Yleensä suuri osa loppukilpailuun tulijoista ei harjoittele lähes yhtään.
Jos ratkot 3 kuukauden ajan aktiivisesti harjoitustehtäviä, niin tulet sijoittumaan lähes varmasti top 10:n joukkoon.
Varmaan kannattaa valita semmoinen ohjelmointikieli, mikä on kilpailukykyinen nopeuden suhteen.
Esim. itse olen koodannut Javalla, mutta jotenkin tuntuu, että siinä ei nopeus tahdo aina oikein riittää täysiin pisteisiin, vaikka toteutus olisi paras mahdollinen.
---
Esim. tarjoan pullakahvit ensimmäiselle, joka pystyy Javalla saamaan täydet pisteet Putka Open 2020 kolmannen kierroksen ensimmäisestä tehtävästä Vaihdot! Jep!
TapaniS kirjoitti:
Varmaan kannattaa valita semmoinen ohjelmointikieli, mikä on kilpailukykyinen nopeuden suhteen.
Koodasin aiemmin cses:n tehtäviä NodeJs:llä, mutta olen nyt siirtynyt c++:aan sen tehokkuuden vuoksi. Yksi NodeJs:n etu olisi ollut sen sisäänrakennettu BigInt ominaisuus, mutta kisapalvelimen versio on sen verran vanha, että se ei tue sitä.
Uskon kyllä, että sinulla on mahdollisuuksia. Harjoittelun lisäksi kannattaa selvittää ongelmat Kisakoodarin käsikirjasta, ja se kannattaa muutenkin silmäillä läpi.
C++ ja Python ovat hyvä yhdistelmä kisaohjelmointiin. Pythonilla saa helposti tehtyä tehtävät, joissa aika ja muisti eivät ole kovin tiukalla, ja C++ oikein käytettynä on usein nopein. Tietorakenteista on syytä tuntea C++:n tärkeimmät: vector, queue, priority_queue, map, set, unordered_map, unordered_set, pair, tuple.
Nykyisiä C++-koodejasi vilkaisin, pari huomiota: make_pair voidaan korvata selvemmin aaltosuluilla, (*it).first on selvemmin it->first, iteraattorien sijaan usein sopii foreach-tyylinen for-silmukka, ja auto-sanaa kannattaa myös hyödyntää.
Yleensä tehtävissä on modulon avulla väistetty isojen lukujen tarve, ja 64-bittinen long (Windowsissa long long) riittää. Jos isompia lukuja tarvitaan, usein tehtävään on jokin niin nopea ratkaisu, että Python pelastaa.
Metabolix kirjoitti:
(*it).first on selvemmin it->first...
Näin siinä käy, kun ei opiskele tarpeeksi ohjelmointikielen perusasioita :DDD
Kauanko yhdelle tehtävälle kannattaa uhrata aikaa, jos se ei ratkea? Kannattaako esimerkiksi paria tuntia kauempaa olla jumissa tehtävässä, jos se ei vain lähde aukeamaan? Itse loppukisassa ei varmaan ole järkevää jäädä pohtimaan yhtä tehtävää liian kauaksi aikaa.
AtskaFin kirjoitti:
Kauanko yhdelle tehtävälle kannattaa uhrata aikaa, jos se ei ratkea?
Tähän on varmasti monta vaihtoehtoa. Joka tapauksessa ajankäyttö kannattaa suunnata sinne, mistä saa helpoiten pisteitä.
Itse teen tehtävät muutamassa vaiheessa: Ensin luen tehtävät järjestyksessä ja teen ne, joihin on minuutissa selvä ajatus. Jos tulee virhe eikä tule minuutissa jotain korjausta mieleen, siirryn seuraavaan tehtävään. Seuraavalla kierroksella käytän joka tehtävään esimerkiksi 15 minuuttia miettimistä ja koodaan, jos tulee hyvä idea. (Miettimisen aikana voi joka tapauksessa koodata syötteen ja tulosteen.) Jos kaikki tehtävät ovat jumissa, pitää yrittää arvioida, mikä niistä olisi todennäköisintä saada tehtyä. Lisäksi pitää laskea rimaa ajoissa, jotta ehtii tehdä edes niitä pienempien pisteiden ratkaisuja, joita toivottavasti tulee mieleen jo edellisten ajatuskierrosten aikana.
Ajattelisin, että jos on 2-4 tehtävää tekemättä eikä mihinkään ole hyvää ideaa, yhteen tehtävään voi käyttää enintään noin puolet jäljellä olevasta ajasta, kuitenkin niin, että kaikkiin ehtii tehdä vaihtoehtoisen ratkaisun. Toisaalta jos ei ole mitään lupaavia ideoita, kannattaa siirtyä heti tekemään niitä hitaampia ratkaisuja ja palata sitten miettimään parempia, jos aikaa jää yli. Aika usein myös nopea ratkaisu tulee hitaammasta jollain pienellä lisäoivalluksella, joten paremman idean puuttuessa hitaan ratkaisun tekeminen voi johtaa läpimurtoon, ja joka tapauksessa kannattaa kerätä edes ne pisteet, jotka pystyy.
AtskaFin kirjoitti:
Kauanko yhdelle tehtävälle kannattaa uhrata aikaa, jos se ei ratkea?
Tärkeintä on maksimoida kokonaispistemäärä eikä jättää ottamatta helppoja pisteitä pienistä osatehtävistä.
Tyypillinen virhe kisoissa on, että jumittuu yhteen tehtävään ja käyttää siihen lähes kaiken ajan miettimättä muita tehtäviä.
TapaniS kirjoitti:
Esim. tarjoan pullakahvit ensimmäiselle, joka pystyy Javalla saamaan täydet pisteet Putka Open 2020 kolmannen kierroksen ensimmäisestä tehtävästä
No joo - hieno ratkaisu tuohon löytyi! En olisi kyllä uskonut, että on mahdollista.
No pullakahvit olen velkaa! Nyt vaan on hiukan vaikeuksia keksiä, miten tuo hoituisi parhaiten ...
Sija 7. :DD
Onneksi olkoon!
Onneksi olkoon! Minunkin puolesta!
Metabolix kirjoitti:
Onneksi olkoon!
walkout_ kirjoitti:
Onneksi olkoon! Minunkin puolesta!
Paljon kiitoksia! En olisi kyllä itse uskonut, että tulisin sijoittumaan 10 parhaan joukkoon. Valtava kiitos kuuluu siitä kyllä ohjelmointiputkalle. En uskoisi, että olisin lähellekkään samassa tilanteessa ilman ohjelmointiputkaa.
Edessä on nyt siis luultavasti heinäkuussa inttiin meno ja sen jälkeen helsingin yliopistoon.
AtskaFin kirjoitti:
(25.01.2021 20:59:41): ”– –” ”– –” Paljon kiitoksia! En olisi kyllä itse uskonut...
Olet siis hakemassa nyt siis ihan master's degree -tason tutkintoa?
"Tietojenkäsittelytieteen kandiohjelma, luonnontieteiden kandidaatti ja filosofian maisteri (3v + 2v)"
Tuolla nimikkeellä koulutus on helsingin yliopistossa, johon aion hakea.
Aihe on jo aika vanha, joten et voi enää vastata siihen.