You are on page 1of 7

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE

5. KOLO

RJEŠENJA
HONI 2010/11 Zadatak GLJIVE

5. kolo, 5. veljače 2011. Autor: Adrian Satja Kurdija

Najprije primijetimo da udaljenost broja X od 100 računamo kao razliku: X-100 ako
je X veći ili jednak 100, a 100-X ako je X manji od 100.

Redom zbrajamo brojeve bodova dodijeljene gljivama. Čim nam se pojavi zbroj koji
je veći ili jednak 100, ili ćemo odabrati taj zbroj, ili onaj prethodni (koji je manji od
100) - i onda od ta dva izračunamo koji je bliži 100 (ako su jednako blizu,
ispisujemo veći).

Ako se pak nikada ne pojavi zbroj veći ili jednak 100, ispisujemo posljednji zbroj.

Potrebno znanje:

Zbrajanje, oduzimanje i usporeñivanje prirodnih brojeva

Kategorija

Ad hoc
HONI 2010/11 Zadatak KOSARKA

5. kolo, 5. veljače 2011. Autor: Goran Gašić

Zadatak ćemo jednostavno riješiti ako za svaku sekundu u intervalu [0, 48*60]
zapamtimo je li u toj sekundi neka ekipa dala koš (i koja) u pomoćnome nizu. Kako
bismo ovo ostvarili, sva vremena u ulazu treba pretvoriti u sekunde.

Tada je dovoljno jednom for petljom proći po svim sekundama u pomoćnome nizu
te za svaku sekundu dodati jednu sekundu u rješenje odgovarajuće ekipe ako
rezultat nije izjednačen.

Potrebno znanje:

while ili for petlja, nizovi integera

Kategorija

Ad-hoc
HONI 2010/11 Zadatak BRODOVI

5. kolo, 5. veljače 2011. Autor: Adrian Satja Kurdija

Najprije, oduzmimo 1 svim oznakama zabavnih dana. Na taj način dobivamo da


svaki brod dolazi u luku u danima 0, K, 2K, 3K, … - pri čemu je K duljina njegovog
perioda.

Ako sada najraniji zabavni dan (nakon nultog) ima oznaku A, onda brod koji se prvi
pojavio u luci - dakle, koji se pojavio toga dana - ima period duljine A. Sada za sve
naredne zabavne dane djeljive s A zaključujemo da se dotični brod pojavio u te
dane, pa ih možemo ubuduće ignorirati (npr. postavljanjem njihove vrijednosti na -
1), zato što smo ustvrdili koji je brod bio uzrok tih zabavnih dana.

Gornji postupak ponavljamo: nalazimo sljedeći najraniji zabavni dan (koji nije
ignoriran) - neka je njegova oznaka B, i potom ignoriramo sve naredne zabavne
dane djeljive s B.

Konačno, traženi minimalan broj brodova upravo je broj ponavljanja opisanog


postupka (jer svaki put dobivamo jedan novi brod).

Složenost algoritma je O(N2), jer za svaki pronañeni brod (njih je najviše N)


prolazimo po zabavnim danima (kojih je najviše N).

Potrebno znanje:

Osnove djeljivosti

Kategorija

Teorija brojeva
HONI 2010/11 Zadatak HONI

5. kolo, 5. veljače 2011. Autor: Stjepan Glavina

Neka su A1, A2, …, AN skupovi zadataka težina 1, 2, … N. Neka su B2, B3, ...BN
skupovi zadataka težina 1 ili 2, 2 ili 3, …, N-1 ili N. Osim toga, neka je B1 = 0.
Sada možemo riješiti zadatak dinamičkim programiranjem. Idemo po redu od prve
do N-te težine te za svaku težinu biramo zadatak. Kada biramo zadatak težine T,
moramo samo znati jesmo li u prethodnom koraku iskoristili neki od zadataka u
skupu BT. Zato je dovoljno imati tablicu oblika dp[t][b].

Slijedi ovakva relacija:


dp[0][0] = 1
dp[0][1] = 0
dp[i][0] = dp[i-1][0] * (Ai + Bi) + dp[i-1][1] * (Ai + Bi - 1)
dp[i][1] = dp[i-1][0] * Bi + dp[i-1][1] * Bi+1

Potrebno znanje:

Dinamičko programiranje

Kategorija

Dinamičko programiranje
HONI 2010/11 Zadatak DVONIZ

5. kolo, 5. veljače 2011. Autor: Goran Žužić

Fiksirajmo sredinu zanimljivog niza na sve moguće načine. Jasno je da ako postoji
zanimljiv niz duljine 2N oko spomenute sredine, da će jednako tako postojati i
zanimljiv niz duljine 2M < 2N oko iste sredine za svaki prirodni M < N. To nas
dovodi do ideje da metodom binarnog pretraživanja nañemo za svaku sredinu
najdulji zanimljiv niz oko nje u složenosti O(n log n).

Za svaki element nas zanima koji je najdulji zanimljivi niz koji počinje sa tim
elementom. Rješavat ćemo element po element slijeva nadesno. Jasno je da nas od
svih zanimljivih nizova [ai, bi] koji počinju prije elementa kojeg obrañujemo
(označimo trenutni element sa X, dakle ai≤X) zanima onaj kojemu je vrijednost (bi-
ai+1)-2(X-ai) = bi+ai+1-2X maksimalna. No tu vrijednost je lako naći: kada
obrañujemo neko polje pamtimo maksimalnu dosad nañenu vrijednost te je
pokušamo poboljšati sa zanimljivim nizovima koji počinju na trenutnoj lokaciji.
Prilikom pomaka udesno, smanjimo najbolju dosadašnju vrijednost za 2 (zato jer se
pomakom X := X+1 navedena vrijednost uvijek smanjuje za 2). Implementacijom
navedenog je lagano doći do O(n log n) algoritma koji rješava cijeli problem.

Potrebno znanje:

Binarno pretraživanje, operiranje sa intervalima

Kategorija

Pretraživanja, jednostavne strukture podataka


HONI 2010/11 Zadatak SLIKA

5. kolo, 5. veljače 2011. Autor: Goran Gašić

Najprije primijetimo da se u složenosti O(M) možemo riješiti svih SAVE i LOAD


naredbi. Niz naredbi obrañujemo od posljednje prema prvoj. Nailaskom na LOAD
naredbu ignoriramo sve naredbe do pripadajuće SAVE naredbe. Ovim postupkom
dobili smo ekvivalentan niz koji se sastoji isključivo od PAINT naredbi.

Zadatak sada možemo riješiti sweep-line algoritmom po retcima slike. Održavat


ćemo dva tournament stabla, nazovimo ih crvenim i bijelim stablom. Crveno stablo
sadržavat će šahovnice koje boje parna, dok će bijelo sadržavati šahovnice koje
boje neparna polja u trenutačnome retku. Svakim prelaskom u novi redak zamijenit
ćemo crveno i bijelo stablo. Čvorovi stabala sadržavat će skupove šahovnica koje
pokrivaju njima pripadajuće intervale, sortirane po vremenu bojanja.

Svaku šahovnicu možemo ubaciti i izbaciti iz odgovarajućeg stabla u složenosti


O(log N * log M), a upite za pojedina polja možemo obaviti u složenosti O(log N),
zbog čega je ukupna složenost algoritma O(N2 * log N + M * log N * log M).

Alternativno, zadatak se može riješiti koristeći union-find algoritam, u složenosti


O(N * M). Razradu ovog rješenja ostavljamo za vježbu čitatelju.

Potrebno znanje:

Tournament stablo, union-find algoritam

Kategorija

Napredne strukture podataka

You might also like