Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE
5. KOLO

OPISI ALGORITAMA
HONI 2011/2012 Zadatak PAHULJE
5. kolo, 17. ožujka 2012. Autor: Adrian Satja Kurdija

Primijetimo da se svakog dana broj pahulja poveća za A - B, pa


ukupno povećanje nakon N dana iznosi N * (A - B), što znači da treba
ispisati broj

M + N * (A - B).

Potrebno znanje: unos/ispis cijelih brojeva, osnovne računske


operacije

Kategorija: ad hoc
HONI 2011/2012 Zadatak MENZA
5. kolo, 17. ožujka 2012. Autor: Bruno Rahle

Kako bismo najlakše riješili ovaj zadatak, cijena se prvo mogla


pretvoriti samo u kune (ali s decimalnim mjestima):

C = K + L/100

Neka sa X označimo ukupnu cijenu ručka, tj. broj koji trebamo ispisati.
Tada, prema tekstu zadatka vrijedi:

X*P=C
X=C/P

Potrebno je ispisati dobiveni broj X, ali posebno cijeli dio, dok


decimalni dio trebamo zaokrižiti na dvije decimale. Prema tome,
trebamo ispisati K’ i L’ koje dobijemo ovako:

K’ = zaokruži_na_niže(X)
L’ = zaokruži(X*100 - K’*100)

Potrebno znanje: unos/ispis cijelih brojeva, rješavanje jednadžbi s


decimalnim brojevima, zaokruživanje brojeva.

Kategorija: matematika
HONI 2011/2012 Zadatak KRIŽALJKA
5. kolo, 17. ožujka 2012. Autor: Bruno Rahle

Prvi dio koji je trebalo riješiti jest detekcija prvog slova iz riječi A koje
se pojavljuje u riječi B. To se može riješiti koristeći dvije ugnježđene
for petlje (prva služi za odabir slova iz A, druga za odabir slova iz B).
Pozitivna posljedica takvog načina rješavanja jest da će tako
pronađena slova biti ujedno i prva u odgovarajućim riječima, tj. naći
ćemo ujedno i mjesto na kojemu se riječi trebaju križati.

Nakon što pronađemo gdje se riječi križaju, potrebno je još ispisati


riječi. To je najlakše izvesti pomoću dvije ugnježđene for petlje -
vanjska ide od 1 do dužine riječi B, a unutarnja od 1 do dužine riječi
A. Prilikom svakog koraka unutarnje petlje, provjerimo trebamo li
ispisati slovo riječi B, slovo riječi A, ili nijedno od njih (u tom slučaju
ispišemo točku).

Potrebno znanje: for petlje, stringovi

Kategorija: stringovi
HONI 2011/2012 Zadatak EKO
5. kolo, 17. ožujka 2012. Autor: Adrian Satja Kurdija

Naivno rješenje isprobavat će moguće visine, od najmanje prema


najvećoj ili obrnuto, dok ne nađe pravu visinu. Iskušavanje visine
vršimo prolaskom po nizu stabala i zbrajanjem posječenih dijelova.
Ovaj algoritam je složenosti O( N * najveća_visina ) i nije dovoljno
brz.

Za brže rješenje potrebno je smanjiti broj visina koje iskušavamo.


Razmišljajmo na sljedeći način. Pretpostavimo da smo iskušali visinu
H’ i tako posjekli manje od M metara drva. Iz toga možemo zaključiti
da je tražena visina H sigurno manja od H’. Slično, ako smo sječom na
visini H’’ dobili barem M metara drva, tražena visina H sigurno je veća
ili jednaka H’’.

Sada se prirodno nameće algoritam binarnog pretraživanja:


održavamo donju i gornju granicu intervala u kojem se nalazi tražena
visina i u svakom koraku iskušamo visinu H’ koja se nalazi na sredini
tog intervala te, ovisno o rezultatu, reduciramo interval traženja na
prvu ili drugu polovicu trenutnog intervala.

Zadatak je moguće riješiti i na drugi način, tako da niz stabala


sortiramo od najvišeg prema najnižem, inicijalno postavimo traženu
visinu na visinu najvišeg stabla i postepeno je smanjujemo na visine
nižih stabala dok ne primijetimo da smo posjekli barem M metara
drva. Detaljniju razradu ovog rješenja ostavljamo čitateljima za
vježbu.

Potrebno znanje: rad s nizom, binano pretraživanje

Kategorija: binarno pretraživanje


HONI 2011/2012 Zadatak DNA
5. kolo, 17. ožujka 2012. Autor: Adrian Satja Kurdija

Zadatak rješavamo dinamičkim programiranjem. Neka je f(K) najmanji


broj mutacija potreban da prvih K slova pretvorimo u A. Analogno,
neka je g(K) najmanji broj mutacija potreban da prvih K slova
pretvorimo u B.

Izvedimo rekurzivnu relaciju za f(K).

Ako je K-to slovo stringa već jednako A, očito je


f(K) = f(K-1).

Ako je pak K-to slovo stringa jednako B, imamo dvije mogućnosti:

1. Promijeniti K-to slovo mutacijom prve vrste, što daje ukupno


f(K-1) + 1 mutacija;

2. Promijeniti čitav prefiks duljine K (mutacija druge vrste); u ovom


slučaju prvo trebamo prvih K-1 slova promijeniti u B (da bi nakon
promjene prefiksa ta slova postala A) za što nam je potrebno g(K-1)
mutacija. Ukupno dakle u ovom slučaju koristimo
g(K-1) + 1 mutacija.

Dakle, ako je K-to slovo stringa jednako B, onda je


f(K) = min{ f(K-1) + 1, g(K-1) + 1 }.

Analogne relacije treba izvesti i za funkciju g(K).

Sada lako rješavamo zadatak redom računajući f(1), g(1), f(2), g(2),
f(3), g(3) i tako dalje do traženog f(N).

Zadatak možemo riješiti i malo jednostavnije. Prolazimo unatrag po


stringu pretvarajući slovo po slovo u A. Kad naiđemo na A, samo
nastavimo dalje. Kad naiđemo na B, trebamo na mudar način odlučiti
koju mutaciju iskoristiti. Strategija koja mijenja samo taj B ako ispred
njega u stringu stoji A, a inače mijenja cijeli prefiks, pokazuje se
točnom. Ovom algoritmu nedostaje dokaz, kao i trik koji na brz način
mijenja cijeli prefiks stringa, što ostavljamo čitateljima za vježbu.

Potrebno znanje: matematička analiza problema


Kategorija: dinamičko programiranje
HONI 2011/2012 Zadatak RAZBIBRIGRA
5. kolo, 17. ožujka 2012. Autor: Frane Kurtović

Primijetite da nam cijele riječi uopće nisu bitne, već samo početno i
krajnje slovo. Zato je za svaki par početnog i krajnjeg slova dovoljno
pamtiti broj riječi koje imaju taj oblik.

Odabiremo na sve moguće načine slova koja se nalaze u vrhovima


kvadrata (264 mogućnosti). Za svaki odabir rješenju pribrajamo broj
kvadrata s točno tim vrhovima.

Na svaku stranicu možemo staviti bilo koju riječ pod uvjetom da


započinje i završava odgovarajućim slovima u vrhovima. Odabir riječi
na stranicama bio bi neovisan kada bismo mogli u kvadrat staviti istu
riječ više puta. Označimo li broj mogućih riječi na stranicama s A, B, C
i D redom, rješenje bi tada bilo A*B*C*D (ne računajući da istu riječ
ne smijemo više puta odabrati).

Ako postoje dvije stranice koje traže jednak par početnog i krajnjeg
slova, na primjer prve dvije stranice, tada je rješenje A*(A-1)*C*D.
To je zato što prvu riječ možemo odabrati na A načina, a drugu riječ
na A-1 način, jer kod odabira druge riječi više ne možemo odabrati
onu riječ koju smo stavili na prvu stranicu.

Istim razmišljanjem dolazimo do zaključka da, ako K stranica traži isti


par početnog i krajnjeg slova, tih K stranica možemo odabrati na
A*(A-1)*....*(A-K+1) načina.

Složenost rješenja, ne računajući unos podataka, iznosi O(264).

Potrebno znanje: matematička analiza problema

Kategorija: prebrojavanje
HONI 2011/2012 Zadatak BLOKOVI
5. kolo, 17. ožujka 2012. Autor: Anton Grbin

Promotrimo neki stabilni razmještaj pravokutnika. Uvjet stabilnosti


tvrdi da je X-težište svih pravokutnika bez najnižeg udaljeno za najviše
1 od X-centra najnižeg pravokutnika. Ako u to težište uračunamo i
težinu tog najnižeg pravokutnika, dobivamo težište cijelog razmještaja
koje je udaljeno za najviše 1 od X-centra najnižeg pravokutnika.

Neka je dx(S) razlika x-koordinate najdesnije točke nekog


pravokutnika u razmještaju S i njegovog težišta. Ova vrijednost je
translatiranjem razmještaja po X-osi očuvana.

Sa Sk označimo neki stabilni razmještaj najviših k pravokutnika.


Kažemo da je Sk optimalan ako ne postoji drugačiji razmještaj najviših
k pravokutnika koji ima veću dx vrijednost od Sk.

Traženo rješenje u zadatku je dx(Sn-1) + 1, za neki optimalni Sn-1.

Optimalne razmještaje određujemo koristeći dinamičko programiranje.


U stanju pamtimo dx i ukupnu težinu M trenutnog optimalnog
razmještaja.
Trivijalni slučaj je S1 za koji vrijedi: dx = 1, M = težina posljednjeg
pravokutnika u ulazu.

Određivanje Sj+1 na temelju Sj:


j+1 pravokutnik s vrha podmećemo ispod trenutnog razmještaja i
pritom razlikujemo dva slučaja:

● X-težište razmještaja Sj se poklapa s gornjim desnim vrhom


novog pravokutnika
● X-težište razmještaja Sj se poklapa s gornjim lijevim vrhom
novog pravokutnika

Između dva nova razmještaja biramo onaj s većom dx vrijednosti.

Potrebno znanje: razumijevanje težinske sredine, matematička


analiza problema

Kategorija: dinamičko programiranje


HONI 2011/2012 Zadatak POPLOČAVANJE
5. kolo, 17. ožujka 2012. Autor: Filip Pavetić

Možemo primijetiti sljedeće: ukoliko na poziciji i u velikoj riječi (onoj


koja opisuje ulicu) znamo najdulju malu riječ (ploču) koju možemo
staviti tako da ona počinje na poziciji i, problem nam se svodi na
pronalazak unije intervala što rješavamo jednim sweepom.

Ono što preostaje je efikasno pronaći najdulju riječ za svaku poziciju,


što možemo učiniti na nekoliko načina:

a) sufiks polje

Kao i velik broj zadataka sa stringovima i ovaj je moguće riješiti


pomoću sufiks-polja (suffix array). Radi se o sortiranom nizu svih
sufiksa nekog stringa, a moguće ga je dobiti na više načina, no
najjednostavnija konstrukcija složenosti O(N log2 N) pomoću hash- -
inga dovoljno je dobra za ovaj zadatak.

Bitno je primijetiti kako su indeksi onih sufiksa, čiji je prefiks neka od


zadanih M riječi, susjedni u sufiks-polju, odnosno čine interval sufiksa.
Interval za svaku riječ možemo pronaći binarnim pretraživanjem. Kada
imamo sve intervale, za svaki sufiks nas zanima koja je najdulja od M
riječi čiji ga interval prekriva, što pronađemo jednim sweepom. Drugim
sweepom, poznavajući najdulju riječ koja može počinjati na svakoj
poziciji, jednostavno odredimo koja su sva polja pokrivena.

Moguća su i druga efikasna rješenja koja koriste hashing.

b) Aho Corasick stablo

Aho Corasick stablo služi za pronalazak mnogo malih riječi u velikoj u


jednom prolazu kroz veliku riječ. Izgradnja stabla ima složenost
O(suma_duljina_malih_riječi), dok sam pronalazak mjesta
podudaranja ovisi o njihovom broju.

Osnovna ideja iza stabla dobro je opisana u sljedećim materijalima:


http://www.cbcb.umd.edu/confcour/CMSC858W-materials/Lecture4.pdf
http://www.cs.uku.fi/~kilpelai/BSA05/lectures/slides04.pdf

Za potrebe ovog zadatka, kod izgradnje stabla možemo za svaki čvor


pratiti podatak o najduljoj od zadanih “malih” riječi koja je sufiks
prefiksa koji taj čvor predstavlja. Neka M(x) označava tu vrijednost u
čvoru x. M(x) je tada maksimum od:
- dubina(x), ukoliko u x završava neka mala riječ,
- M(failureLink(x))
(failureLink opisan je u danim materijalima).

Izgradnja stabla zadržava složenost sume malih riječi, dok je (iz


razloga što nas ne zanimaju sva mjesta podudaranja, već samo
maksimalne duljine za svaku poziciju u velikoj riječi) složenost
pretrage velikog teksta linearna s njegovom duljinom. Kada dolazimo
na neko slovo, pokušamo se spustiti u stablu. Ukoliko to nije moguće,
krećemo se po failureLinkovima dok ne dođemo ili do čvora iz kojeg se
možemo spustiti, ili do korijena stabla. U čvoru u kojem smo završili
uzimamo prethodno izračunati maksimum te postavljamo granice
intervala za kasniji sweepline.

Potrebno znanje: sufiks polje, Aho Corasick stablo, sweepline

Kategorija: stringovi, sweepline

You might also like