Programerski osvrt na drugo kolo Ljetne lige C++ 2011 za kadete

Programerski osvrt na drugo kolo Ljetne lige C++ 2011 za kadete

26.07.2011.

Danas je završeno 2. kolo ljetne lige C++ za kadete. Zadaci su ovog puta malo pojačani, što možemo i pročitati iz samih rezultata :-).

Ponovno smo naišli na različite i zanimljive pristupe, posebice u trećem zadatku "otoci". :-)
Isto tako, drago nam je da su nekim natjecateljima svi "pravci" uvijek paralelni :-P, iako nam nije drago da se još uvijek pokušava dijeliti s nulom :-(
Što se tiče sortiranja stringova, ono je leksičko, te duljina niza nije primarni kriterij (zadatak "Max-suma"), tako da bi poravnanje sa prefiksnim nulama bilo od pomoći, a ne bi bio niti veliki problem uvesti vlastiti kriterij usporedbe...

Slijedi nekoliko dobrih praksi i pravila kojih bi se trebali pridržavati svi natjecatelji pri riješavanju zadataka i predaji rješenja:

1) Valja pripaziti na imenovanje datoteka, ime datoteke s rješenjem se uvijek nalazi pri samom dnu teksta zadatka.
2) Preporuka je radi uniformnosti, prije predavanja rješenja zakomentirati ili obrisati svaku pojavu system("pause"); 
3) Ispis valja završiti u novom retku, dakle zadnji znak koji bi trebalo ispisati je endl. Drugim riječima korisite cout << endl; ili printf("\n");
4) U svakom zadatku su zadana ograničenja (tipovi podataka i veličina podataka), te iste uvijek valja uzeti u obzir.
5) Memorijsko ograničenje je u pravilu 32 MB po zadatku, a vremensko je do 30 sekundi po test primjeru. 

Evo i nekoliko prijedloga koji se tiču tipova podataka te njihovog unosa i ispisa:
- Za cijele brojeve koristimo int (%d)
- Za racionalne brojeve koristiom float (%f), a za racionalne brojeve dvostruke preciznosti double (%lf), koristimo izraz "racionalni", jer realni brojevi ne mogu biti pokriveni budući sadrže i iracionalne brojeve koje u stvarnosti i ne možemo točno zapisati u računalu (ograničeni smo veličinom registra ...), a niti na papiru (izuzev simboličkih zapisa)
- za formatirani ispis valja koristiti printf naredbu: npr za racionalni broj zaokružen na 2 decimale pišemo printf("%.2f");
-
kada želimo napraviti desno poravnanje brojeva (npr. na 10 mjesta) onda pišemo printf("%10f"); ili printf("%10d");

Za semdaše, a pogotovo osmaše, bilo bi dobro da prouče i izvježbaju određene algoritme,
posebice su zanimljivi BFS: http://en.wikipedia.org/wiki/Breadth-first_search i DFS: http://en.wikipedia.org/wiki/Depth-first_search

Od ostalih, svakako bi trebalo poznavati sljedeće strukture podataka i algoritme:
-
Apsolutno sve što se tiče stringova i charova
- Stack, Queue, FIFO i LIFO, vezane liste, cirkularne liste, ...
- Longest Common Substring (algoritam za najdulji zajednički podniz)
- Euklidov algoritam najveće zajedničke mjere
- Eratostenovo sito za mapiranje prostih brojeva od 2 - N.
- Rastav brojeva na proste faktore
- Binarno pretraživanje i binarna stabla
- Formule za sumu i pronalazak članova aritmetičkih i geometrijskih nizova
- Algoritam za pronalak težišta poligona
- Algoritmi za izračun presjeka, unije i razlike realnih intervala
- Algoritmi za računanje s velikim brojevima, odnosno zbrajanje, oduzimanje i množenje "stringova"
- Algoritmi za kriptiranje podataka, barem oni najosnovniji - bazirani na XOR-u :-)
- Dvodimenzionalne matrice su uvijek posebno zanimljive, kretanje čovječuljka i izbjegavanje prepreka je česta pojava :-)
- C++ strukture pair, vector i map te pripadne metode i iteratore nad tim objektima
- zatim uporaba funkcija sort i reverse (i ostalo iz <algorithm>), kod sort funkcije svakako obratiti pažnju na mogućnost uvođenja vlastite funkcije za usporedbu elemenata (compare function)
- uvođenje vlastitih struktura podataka (typedef struct )
- kod rekurzivnih rješenja, valja se zapitati da li postoji dinamički pristup (mapiranje izračuna)
- kada sve ostalo zakaže, valja krenuti heurističkim putem :-), a kada i to zakaže, uvijek preostaje brute force i mapiranje rješenja :-)
...

 

Evaluacija na ovoj Ljetnoj ligi te na IBT-u za mlađe kadete se vrši pomoćnim evaluatorom, koji radi sljedeće zadaće:

1) Prevodi natjecateljska riješenja sa g++ compiler-om
2) Poziva natjecateljske izvršne verzije (.exe) sa preusmjerenim ulazom na test primjere, te nakon toga se poziva u istom režimu službeno rješenje
3) Test primjeri se izmišljaju ručno ili sa pomoćnim programom koji ih generira, a tada su oni posve nasumični te u granicama zadanim u tekstu zadatka.
4) Provjera ispravnosti rješenja se radi ručnim putem: usporedbom natjecateljskih izlaza sa službenim izlazima
5) Bodovi se mogu dijeliti na način da se priznaju samo potpuno ispravni izlazi, ili se mogu dijeliti djelomični bodovi za djelomična rješenja, a to ovisi isključivo o prirodi samog zadatka. Tako recimo za zadatke koji traže 3 izlaza, može se davati po trećina ili polovina bodova za djelomična rješenja. 

Toliko u ovom osvrtu, puno sreće na preostalim kolima!

Autor zadataka C++

  

IZDVOJILI SMO

Za odgovore o tome kako se dakle stvaraju centri izvrsnosti poput ovog, morali smo zagrepsti dublje i postaviti nekoliko ključnih pitanja tajniku koji o tome zna najbolje. Kaže za sebe da više voli raditi nego govoriti i da ga se ne može vidjeti na dodjelama medalja...
  

ZANIMLJIVOSTI

Ivan Krstić je prvi čovjek računalne sigurnosti u Apple-u, početkom stoljeća bio je član Saveza, a da je osobit i neponovljiv znali smo odmah...
Zagrebački računalni savez - Sva prava pridržana | Objave portala nije dozvoljeno prenositi bez prethodnog odobrenja Saveza.