You are on page 1of 9

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE

3. KOLO

RJEŠENJA
HONI 2009/2010 Zadatak FILIP
3. kolo, 19. prosinac 2009. Autor: Filip Barl
Jedini problem u zadatku je kako okrenuti brojeve. Ima više različitih načina
na koje je to moguće postići. Korištenje nizova znakova je jedan od najlakših
načina, ako natjecatelj poznaje mogućnosti svojeg jezika dovoljno. Međutim,
postoji i aritmetičko rješenje. Kako znamo da su brojevi troznamenkasti tada
možemo broj X zapisati kao X = X1X2X3. Vidimo da X3 možemo dobiti kao
ostatak dijeljenja broja X sa 10. X2 je ostatak dijeljenja broja X s 100,
umanjen za X3. X1 je X umanjen za X2 i X3. Primjetite da tako dobivene
brojeve množenjem i dijeljenjem sa potencijama broja 10 možemo pomicati
po mjestima. Okretanje troznamenkastog broja prikazano je u sljedećem
pseudokodu:

X = ulaz
X1 = X mod 10
X2 = (X mod 100 - X1) / 10
X3 = (X - X2 - X1) / 100
OX = X1 * 100 + X2 * 10 + X3

Potrebno znanje:
Učitavanje brojeva, jednostavne aritmetičke operacije, operacije sa
znakovima

Kategorija:
ad-hoc
HONI 2009/2010 Zadatak SLATKISI
3. kolo, 19. prosinac 2009. Autor: Leo Osvald
Rješenje zadatka je vrlo direktno. Potrebno je samo pažljivo implementirati
operaciju zaokruživanja. Uz dobro poznavanje programskog jezika moguće je
koristiti funkcije zaokruživanja ugrađene u jezik.

Potrebno znanje:
Učitavanje broja, jednostavne aritmetičke operacije

Kategorija:
ad-hoc, poznavanje jezika
HONI 2009/2010 Zadatak SORT
3. kolo, 19. prosinac 2009. Autor: Luka Kalinovčić
U zadatku je potrebno prebrojati za svaki broj koliko puta se nalazi u nizu,
te zatim niz presložiti po padajućoj vrijednosti pojavljivanja. Ovaj zadatak
moguće je riješiti na više načina. Ovdje donosimo neka:

2
Rješenje vremenske složenosti O(N log N) i prostorne složenosti
O(1):
Koristimo li bilo koji postupak sortiranja složenosti O(N log N) ukoliko u O(N)
možemo za neka dva elementa niza A i B odgovoriti nalazi li se A ispred ili
iza B (drugim riječima, izračunati relaciju sortiranja) tada je ukupna složenost
2
O(N log N). Trivijalno je jasno da prolaskom cijelog niza u N koraka je
moguće prebrojiti sva pojavljivanja broja A i broja B i saznati odgovor.

2
Rješenje vremenske složenosti O(N log N) i prostorne složenosti
O(N):
Korištenjem rječnika za pohranu učestalosti brojeva možemo u O(N log N)
izračunati tablice učestalosti. Tada korištenjem tih tablica možemo u O(logN)
odgovoriti na usporedbu dva broja, pa korištenjem sortiranja složenosti
O(NlogN) dobivamo rješenje.

Rješenje vremenske složenosti O(N log N) i prostorne složenosti


O(N):
Korištenjem hashiranja za pohranu učestalosti brojeva možemo u O(N)
izračunati tablice učestalosti. Korištenjem tih tablica možemo u O(1)
usporediti dva broja. Vrlo je važno koristiti dobru metodu hashiranja
kako bi se smanjila mogućnost kolizije.

Potrebno znanje:
Učitavanje niza, uspoređivanje brojeva, strukture podataka

Kategorija:
strukture podataka
HONI 2009/2010 Zadatak RAZGOVORI
3. kolo, 19. prosinac 2009. Autor: Leo Osvald
Uočimo da pohlepna strategija nalazi optimalno rješenje. Svaki puta kad
detektor na lokaciji i detektira neki razgovor, pretpostavit ćemo da se
razgovor odvija između najlijevije i najdesnije kuće za koje je to moguće.
To znači da svi detektori između te dvije kuće moraju detektirati bar jedan
razgovor. Ne-naivnom implementacijom ove ideje, pri kojoj pazimo da
detektor koji još ima detektiranih poziva nalazimo u amortiziranoj
konstantnoj složenosti, pod uvjetom da smo prethodno sortirali detektore po
pozicijama, dobivamo algoritam vremenske složenosti O(N log N + N*C) koji
donosi 50% bodova.

Kako bi bolje shvatili rješenje koje donosi sve bodove, idemo razmotriti još
jedno rješenje koje nije dovoljno efikasno:
Sortiramo detektore po pozicijama i krećemo od najlijevijeg detektora te
se pomaknemo malo udesno, te znamo da se uspostavilo točno C1 poziva,
pa stavljamo na stog C1 elemenata, te krećemo na drugi detektor. Ako je
drugi detektor detektirao više uspostavljenih razgovora od prvog (ili jednako),
dodajemo razliku na stog (jer su se uspostavili neki novi pozivi), a ako
ima manje detektiranih poziva, to znači da su neki već završili, točnije broj
završenih razgovora jednak je razlici tih dvaju brojeva, pa toliko razgovora i
skidamo sa stoga. Kod skidanja stoga mi zapravo odlučimo prekinuti zadnjih
nekoliko razgovora koji su uspotavljeni. Na ovaj način mi prekidamo
razgovore samo onda kada je to apsolutno nužno da ne bismo upali u
kontradikciju s očitanjima detektora, što upućuje na to da ćemo ovom
strategijom isto doći do minimalnog broja razgovora koji su se mogli dogoditi.
Dakle sve što treba napraviti jest ustanoviti koliko puta neki razgovor
skidamo sa stoga.

Primjetimo da je gornji problem ekvivalentan traženju svih pozicija detektora


na kojima se broj očitanja u odnosu na prethodni detektor smanjio, te
sumiranju tih razlika. Dodatno, moramo ovoj sumi pridodati i broj elemenata
koji je zasigurno ostao na stogu u slučaju da zadnji tj. najistočniji detektor
ima bar jedno očitanje. Ovime dolazimo do rješenja vremenske složenosti
O(N log N), koje formalno možemo zapisati na sljedeći način:
,
pod pretpostavkom da je niz a čine sortirana očitanja svih detektora.

Potrebno znanje:
dinamika, pohlepni algoritmi

Kategorija:
pohlepna strategija
HONI 2009/2010 Zadatak PATULJCI
3. kolo, 19. prosinac 2009. Autor: Luka Kalinovčić
Za početak, pokazat ćemo kako možemo prebrojati koliko patuljaka ima
kapicu određene boje.
Dovoljno je naime, za svaku boju, stvoriti niz brojeva u kojem su zapisane
pozicije patuljaka koji imaju kapicu te boje u sortiranom poretku.
Na primjer, ako patuljci tvore niz 1, 1, 2, 1, 3, 3, 2, 1, 3. Tada ćemo stvoriti
tri niza brojeva:
1, 2, 4, 8
3, 7
5, 6, 9
U tim nizovima možemo binarnim pretraživanjem pronaći prvi broj veći ili
jednak A, te prvi broj manji ili jednak B. Razlika u pozicijama ta dva broja
uvećana za 1 daje ukupni broj patuljaka s kapicama određene boje.
Dakle, u vremenu O(log N) možemo odrediti dominira li određena boja X na
slici [A, B].
Za preostali dio zadatka dovoljno je primjetiti da ako neka boja dominira u
nekom intervalu, tada pri svakom nasumičnom odabiru patuljka iz intervala
imamo preko 50% vjerojatnost da odaberemo patuljka s kapicom te boje.
Stoge ćemo 25 puta nasumično odabrati patuljka iz intervala, te provjeriti
dominira li njegova boja na slici. Ako nakon 25 pokušaja ne pronađemo
25
boju koja dominira, tada možemo sa vjerojatnošću većom od 1-0.5 ~
99.999997% biti sigurni da se ta slika ne sviđa Snjeguljici.
Opis alternativnog rješenja (na engleskom) nalazi se na sljedećem
linku: http://forums.topcoder.com/
?module=Thread&threadID=653017&start=45&mc=85#1177646

Potrebno znanje:
sortiranje, binarno pretraživanje

Kategorija:
ad-hoc
HONI 2009/2010 Zadatak PLANETE
3. kolo, 19. prosinac 2009. Autor: Goran Žužić
Terminologije radi, oznaka X | Y označava da broj X dijeli broj Y, tj. da
postoji cijeli broj k takav da k*X = Y.

Označimo sa X1, X2, .., Xm trajanja pojedinih fenomena u danima. Bitno je


bilo primjetiti da izjava

• "između datuma A i B dogodilo se 1 fenomena 1, 2 fenomena 2,


itd."

je potpuno ekvivalentna izjavi

• "365 | ( 1X1+ 2X2+...+ mXm-(B-A))".

gdje B-A označava razliku u danima između datuma A i B. Nadalje, ta je


izjava ekvivalentna ovima dvijema izjavama uzetim zajedno (u konjunkciji):

• "5 | ( 1X1+ 2X2+...+ mXm+A-B)"


• "73 | ( 1X1+ 2X2+...+ mXm+A-B)"

(primjetite da 365=5*73). Budući da su i 5 i 73 prosti brojevi, moguće je


Gaussovom eliminacijom pronaći mogući skup ostataka X-eva pri djeljenju
sa 5 i pri djeljenju sa 73 odvojeno. Potom je moguće koristeći kineski
teorem ostataka jednoznačno odrediti ostatak svakog X-a po modulu 365.
Dakako, takvo rješenje će zadovoljavati uvjete zadatka.

Literatura:
• http://en.wikipedia.org/wiki/Gaussian_elimination
• http://en.wikipedia.org/wiki/Modular_arithmetic
• http://en.wikipedia.org/wiki/Chinese_remainder_theorem

Potrebno znanje:
diskretna matematika
Kategorija:
modularna aritmetika, modularni inverz, Gaussova eliminacija

You might also like