Professional Documents
Culture Documents
INFORMATIKE 2013/2014
4. KOLO
OPISI ALGORITAMA
HONI 2013/2014 Zadatak KEFIR
1. kolo, 22. listopada 2012. Autor: Adrian Satja Kurdija
Kategorija: ad hoc
domacin := x1 + x2;
gost := y1 + y2;
izlaz(domacin + gost);
Kategorija: ad hoc
Kategorija: ad hoc
Za svaki vertikalni dio zanima nas broj rezova koje ćemo produljiti s
prethodnoga dijela. Pretpostavimo da je prethodni vertikalni dio bio
podijeljen na 30 dijelova, a da trenutni dio valja podijeliti na 70 dijelova.
Primijetimo da su oba broja djeljiva s 10. To znači da prvih 30 dijelova
možemo promatrati kao 10 velikih dijelova po 3, a novih 70 dijelova kao 10
velikih dijelova po 7. Veliki se dijelovi podudaraju i rezove između njih
možemo produljiti. Tih rezova ima 10 - 1 = 9. Preostalih 69 - 9 rezova valja
nam započeti i pribrojiti rješenju.
Tražimo dakle broj različitih visina na kojima nešto valja rezati. Ponovno, na
trenutnom vertikalnom dijelu, koji valja razrezati na T komada, tražimo broj
rezova koje možemo produljiti s nekog od prethodnih vertikalnih dijelova.
Visine koje nas zanimaju su 1/T, 2/T, …, (T - 1)/T.
Kategorija: matematika
Kategorija: ad hoc
Zapravo treba provjeriti je li graf koji čini N vrhova (koji predstavljaju borce)
i K bridova (koji predstavljaju borbe) bipartitan, tj. je li njegove vrhove
moguće obojiti dvjema bojama tako da su susjedni vrhovi uvijek različitih
boja. To provjeravamo tako da vrhove zaista bojimo: krećemo od vrha 1,
bojimo ga u bijelo, potom njegove susjede bojimo u crno (jer moramo),
potom susjede ovih susjeda bojimo u bijelo (jer moramo) i tako dalje.
Ovakvo bojenje provodimo BFS ili DFS algoritmom. Algoritam završava kad
smo uspješno obojili sve komponente grafa, što znači da je bojenje moguće,
ili kad smo došli u kontradikciju: neki susjed vrha X iz kojeg se trenutno
širimo već je obojen u istu boju kao X, što znači da bojenje nije moguće.
Sad je jasno da tražimo najmanji K za koji će opisana provjera reći da
podjela ne postoji. Iskušavanje svih mogućih K presporo je. Zato traženu
vrijednost broja K pronalazimo binarnim pretraživanjem.
Kategorija: grafovi
Za rješenje koje donosi sve bodove, potrebno je moći brže izračunati koliko
brojeva daje neki količnik pri dijeljenju brojem x.
Uočavamo sljedeće:
brojevi koji pri cjelobrojnom dijeljenju s x daju 0 su svi brojevi iz
intervala [0, x-1]
brojevi koji pri cjelobrojnom dijeljenju s x daju 1 su svi brojevi iz
intervala [x, 2x-1]
općenito, brojevi koji pri cjelobrojnom dijeljenju s x daju k su svi
brojevi iz intervala [kx, (k+1)x-1]
Ako možemo napraviti strukturu koja može brzo odgovarati na pitanje koliko
brojeva iz niza leži u intervalu [a, b] možemo brzo odrediti koliko brojeva
daje količnik k pri dijeljenju s x. Budući da su brojevi iz niza veličine do 106
struktura će zapravo biti jednostavni niz A[] u kojem na mjestu A[t] piše
koliko ima brojeva manjih od t. Sada broj brojeva iz niza koji leže u intervalu
[a, b] računamo po formuli A[b] - A[a - 1].
Najveći količnik k koji možemo dobiti za neki x iznosi V/x. Zato je potrebno
napraviti V/x + 1 upita da bismo odredili koliko ima brojeva koji daju
količnik 0, 1, 2, … V/x pri dijeljenju s x. Budući da za x moramo isprobati
sve brojeve od 1 do V+1 to je ukupno (V/1 + V/2 + V/3 + … + V/(V+1))
upita. Dakle, složenost ovakvog algoritma je O(V lg V).
Kategorija: matematika
Za pune bodove bilo je potrebno izračunati matrice M(k) za k = 20, 21, 22, …
(složenost O(N3 log N)) te potom odrediti minimalni k u postupku koji mu
određuje jednu po jednu znamenku u binarnom zapisu (od najjače prema
najslabijoj). Ukupna složenost postupka još uvijek je O(N3 log N) što je bilo
dostatno za 100% bodova na zadatku.
Kategorija: grafovi