You are on page 1of 8

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE 2013/2014

6. KOLO

OPISI ALGORITAMA
HONI 2013/2014 Zadatak PERO
6. kolo, 8. ožujka 2014. Autor: Marin Tomić

Potrebno je izračunati ukupnu mase kupljenog perja po formuli 40 * N i


ukupnu masu kupljenog željeza po formuli 7874 * M te usporediti dobivene
rezultate i ispisati traženu poruku.

Potrebno znanje: množenje, if uvjet


Kategorija: ad hoc

HONI 2013/2014 Zadatak KISELA


6. kolo, 8. ožujka 2014. Autor: Marin Tomić

Marica je uvijek pojela najviše od djevojaka, a Dorica najmanje. Stoga lako


možemo odrediti koje količine pojedene paprike pripadaju njima. Količinu
paprike koja pripada Jelici tada lako izračunamo kao (A + B + C) - (najveći
+ najmanji). Označimo količinu pojedene paprike koja pripada Marici sa M,
Dorici sa D, a Jelici sa J. Ako ne vrijedi M = 2 * J i J = 3 * D ispisujemo
“OCI VARLJIVE”, a inače lako odredimo poredak djevojaka uz nekoliko if-
uvjeta.

Potrebno znanje: if uvjet, pronalaženje najvećeg i najmanjeg broja


Kategorija: ad hoc

HONI 2013/2014 Zadatak VJEKO


6. kolo, 8. ožujka 2014. Autor: Marin Tomić

Razdvojit ćemo uzorak na dio prije zvjezdice (nazovimo ga S) i na dio nakon


zvjezdice (nazovimo ga T). Ime datoteke odgovara uzorku ako je oblika S +
R + T pri čemu je R neka riječ (moguće i prazna). Dakle, naziv datoteke
mora počinjati sa S, a završavati sa T. No, to nije dovoljan uvjet.
Uzmemo li uzorak “ab*bc”, imamo S = ab i T = bc. Ime datoteke “abc”
počinje sa S i završava sa T, no i dalje ne odgovara uzorku “ab*bc”.
Potrebno je provjeriti preklapaju li se S i T unutar imena datoteke , tj. je li
duljina(S) + duljina(T) > duljina(ime datoteke).

Dakle, ako riječ ne počinje sa S ili ne završava sa T ili je zadovoljen gornji


uvjet za duljine ispisujemo “NE”, inače ispisujemo “DA”.

Rješenje koje ne provjerava preklapaju li se S i T dobiva 50% bodova.

Potrebno znanje: uspoređivanje stringova


Kategorija: stringovi

HONI 2013/2014 Zadatak FONT


6. kolo, 8. ožujka 2014. Autor: Marin Tomić

Potrebno je pronaći broj različitih podskupova skupa zadanih riječi takvih da


riječi u njima zajedno daju sva mala slova engleske abecede. U skupu od N
riječi možemo odabrati 2N podskupova. Budući da je broj N manji od 25,
imamo ih maksimalno 225 = 33554432. Taj broj je dovoljno mali da možemo
proći po svim mogućim podskupovima te provjeriti daju li cijeli abecedu.

Uobičajeni način za prolazak po svim podskupovima nekog skupa je


korištenje rekurzivne funkcije.
f( i ):
ako je i = N + 1: provjeri čine li ubačeni skupovi cijelu abecedu
(prošli smo sve riječi)

inače: dodaj i-tu riječ u skup


pozovi f( i + 1)
izbaci i-tu riječ iz skupa
pozovi f( i + 1 )

Potrebno je još odlučiti kako ćemo predstavljati naše skupove u memoriji


računala kako bi mogli implementirati ubacivanje i izbacivanje riječi u skup.

Jedan mogući način je korištenje niza ima[26] koji za svako slovo abecede
pamti koliko se puta pojavljuje u trenutnom podskupu i varijable ukupno
koja pamti koliko različitih slova ima u trenutnom podskupu.
Kada dodajemo riječ u podskup za svako njeno slovo povećamo brojač u
polju ima[slovo], a brojač ukupno povećavamo samo ako je na mjestu
ima[slovo] do sada pisala nula (ako smo dodali slovo kojeg dosada nije bilo
u skupu). Slično se radi i za izbacivanje riječi iz skupa.
Složenost ovakvog algoritma je O(2M * L) pri čemu je L maksimalna duljina
riječi i on donosi 50% bodova.

Drugi mogući način za predstavljanje skupova slova u memoriji računala je


korištenje bitmaske. Bitmaska je niz jedinica i nula, na i-tom mjestu se
nalazi jedinica ako imamo i-ti element u skupu, a nula ako nemamo. Npr.
skup {a, b, d, z, y} bi predstavili bitmaskom 110...01011 (mjesta su
numerirana zdesna na lijevo). Operaciju unije dvaju skupova predstavljenih
bitmaskama odgovara bitovnoj OR operaciji njihovih bitmaski.
Prednost ovakvog zapisa skupova u memoriji je brzina složenost u kojoj
procesor obavljata bitovne operacije - O(1).
Složenost algoritma uz ovakvu implementaciju skupovnih operacija je O(2M).

Za implementacijske detalje pogledajte izvorni kod.

Potrebno znanje: pronalazak svih podskupova, bitovne operacije


Kategorija: manipuliranje bitovima

HONI 2013/2014 Zadatak KOCKICE


6. kolo, 8. ožujka 2014. Autor: Antonio Jurić, Marin Tomić

Promatrajmo funkciju f(x) u kojoj x označava visinu srednjeg stupca


(najnižeg) koja govori koliko je minimalno potrebno poteza da se hrpe
preurede na zadani način. To možemo izračunati jer je tada minimalan broj
poteza jednoznačno određen: ako u pojedinom stupcu ima više kockica
nego što je potrebno, moramo ih maknuti, a ako nedostaje, moramo dodati
nove kockice.

Imamo dvije hrpe, no zadano je da na kraju moraju imati jednake visine


odgovarajućih stupaca. Tada za Mirkovu hrpu imamo f1(x) = |cm1 - x| +
|cm2 - x| + … + |cmn - x|, a za Slavkovu hrpu imamo f2(x) = |cs1 - x| +
|cs2 - x| + … + |csn - x| gdje su cm1, cm2, … , cmn i cs1, cs2, …, csn konstante
koje ovise o visini i poziciji stupca.

Promotrimo li graf funkcije (f1 + f2)(x) uočit ćemo da je funkcija prvo


padajuća, a zatim rastuća i da ima samo jedan globalni minimum.
Lako se vidi da je taj minimum upravo prva točka m za koju vrijedi (f1 +
f2)(m) < (f1 + f2)(x + 1), tj. točka gdje funkcija počinje rasti. Također
možemo uočiti da za sve točke lijevo od m vrijedi (f1 + f2)(x) > (f1 +
f2)(x + 1), a za sve točke desno (f1 + f2)(x) < (f1 + f2)(x + 1). Zato
točku m možemo naći binarnim pretraživanjem uspoređujući odnos
funkcijskih vrijednosti dvije susjedne točke.

Za detalje pogledajte izvorni kod.

Potrebno znanje: analiza toka funkcije


Kategorija: binarno pretraživanje

HONI 2013/2014 Zadatak KRUŽNICE


6. kolo, 8. ožujka 2014. Autor: Luka Kalinovčić, Anton Grbin

Budući da se kružnice ne sijeku, možemo ih promatrati kao intervale,


odnosno kao njihove presjeke s x osi.
Konstruirajmo relaciju sadrži tako da A sadrži B ako je interval B unutar
intervala A, uz dozvoljeno dodirivanje na rubovima.
Konstruirajmo relaciju direktno_sadrži tako da A direktno_sadrži B ako A
sadrži B i ne postoji niti jedna druga kružnica C za koju vrijedi da A sadrži
C i C sadrži B.
Intuitivno, A direktno_sadrži B ako je B jedna od prvih manjih kružnica u
A.

Budući da postoji najviše jedna kružnica koja direktno_sadrži neku


proizvoljnu kružnicu, ova relacija je stablo.

Svaka kružnica će povećati broj regija za 1 ili 2. U slučaju da kružnica


direktno sadrži više drugih kružnica koje se dodirivaju njenom cijelom
dužinom, ta kružnica će povećati rješenje za 2, u suprotnom za 1.

Stablo kružnica se može izgraditi pomoću sweep algoritma tako da je


događaj početak ili kraj neke kružnice. Događaji će se obrađivati po njihovim
x koordinatama. Kao strukturu sweep algoritma imati ćemo stog u kojem
ćemo pamtiti trenutnu prvi nadređenu kružnicu i jesmo li za sada sve
direktno sadržane kružnice slagali jednu do druge. U trenutku izbacivanja
kružnice iz stoga rješenje povećamo za 2 ako su sve direktno sadržane
kružnice poredane jedna do druge, a za 1 u suprotnom. Konačno rješenje
moramo povećati za 1 što predstavlja cijelu regiju iznad svih kružnica.

Složenost algoritma je O(n log n) gdje je n broj kružnica.

Potrebno znanje: stogovna struktura podatka, sweep line prolaz, stablo

Kategorija: sweep line

HONI 2013/2014 Zadatak HASH


6. kolo, 8. ožujka 2014. Autor: Anton Grbin

Promotrimo jednu iteraciju zadane funkcije sažetka uz pretpostavku da je


trenutna vrijednost sažetka S, a redni broj sljedećeg slova x.

S’ = ((S * 33) xor x) % MOD

Pokušajmo iz nekog trenutnog stanja S i poznatog rednog broja slova koje je


dovelo do tog stanja x dobiti prošlo stanje S’.
Budući da operaciju ostatak pri dijeljenju s potencijom broja dva (2^M)
možemo gledati kao odbacivanje svih bitova nakon M-tog, lako je vidjeti da
vrijedi:

(A xor B) % MOD = (A % MOD) xor (B % MOD)

Stoga,

S’ = ((S * 33) % MOD) xor (x % MOD)

budući da je bitovni isključivo ili sam sebi inverz i da će x uvijek biti manji od
MOD, vrijedi:

S’ xor x = (S * 33) % MOD

Multiplikativni modularni inverz od 33 pod poljem veličine MOD će postojati


ako su 33 i MOD relativno prosti. Budući da je MOD potencija broja dva, ovo
je ispunjeno. Modularni inverz možemo dobiti korištenjem proširenog
Euklidovog algoritma ili brzim potenciranjem.

Prikažimo potpunu inverznu relaciju funkcije sažetka:

(S’ xor x) * inv(33, MOD) = S

Uz ovo, moguće je problem podijeliti na dva dijela. U prvom računamo sve


moguće vrijednosti sažetka za nizove duljine N/2, a u drugom računamo sve
moguće vrijednosti inverznog sažetka za nizove duljine N - N/2 ako
pretpostavimo da je početno stanje tražena vrijednost sažetka K. Ako je do
neke vrijednosti sažetka na sredini T prvi dio algoritma došao t1 puta, a
drugi dio algoritma t2 puta, znači da postoji t1 * t2 različitih nizova koji
imaju vrijednost T točno u sredini izračuna sažetka, a vrijednost K kao
konačnu vrijednost sažetka. Zbrajanjem svih umnožaka po svim
vrijednostima sažetka u sredini izračuna dobivamo konačno rješenje.

Složenost je O(26^(N/2)).

Potrebno znanje: prošireni Euklidov algoritam ili Eulerov teorem i brzo


potenciranje, bitovne operacije, napredna rekurzija, rastavljanje problema
na manje

Kategorija: teorija brojeva, meet-in-the-middle

HONI 2013/2014 Zadatak GRAŠKRIŽJA


6. kolo, 8. ožujka 2014. Autori: Luka Kalinovčić, Adrian Satja
Kurdija

Sortirajmo dane semafore po x-koordinati. Neka je x’ srednja (median) x-


koordinata u tom nizu. Neka je A skup danih semafora lijevo od x’, a B skup
danih semafora desno od x’.

Povežimo bezopasnim putem svaki par semafora a, b takve da je a iz skupa


A, te b iz skupa B. Kako? Tako da dodamo nove semafore na lokacije (x’, y)
za sve y-koordinate y iz skupova A i B. Sada za semafore a i b imamo
bezopasan put (xa, ya) → (x’, ya) → (x’, yb) → (xb, yb).

Još je preostalo povezati međusobno semafore unutar skupa A, kao i


semafore unutar skupa B. To činimo tako da rekurzivno ponovimo opisani
postupak posebno za skup A i posebno za skup B. Ovaj način razmišljanja
naziva se podijeli pa vladaj (divide and conquer).

Koliki je broj dodanih semafora? Budući da dijelimo skup na dva dijela,


najveća je dubina rekurzije O(lg N). Promatrajmo neki početni semafor na
lokaciji (x, y). U najgorem slučaju, na svakoj dubini rekurzije on će biti
uključen u jedan skup i tamo će generirati jedan novi semafor (x’, y). Dakle,
jedan početni semafor generira O(lg N) novih semafora, što daje ukupno
O(N lg N) novih semafora. Točan broj uz pažljivu implementaciju ispada
manji od 700 000.

Potrebno znanje: sortiranje, rekurzija, princip podijeli pa vladaj

Kategorija: ad hoc

You might also like