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

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE 2012/2013

4. KOLO

OPISI ALGORITAMA
HONI 2012/2013 Zadatak SELA
4. kolo, 19. siječnja 2013. Autor: Adrian Satja Kurdija

Traženo selo nalazi se točno na pola puta između sela A i B pa da bi ono


postojalo, razlika brojeva A i B mora biti parna. U tom slučaju rješenje je
prosjek brojeva A i B koji iznosi (A + B) / 2. Ako pak razlika brojeva A i B
nije parna, ispisujemo 0.

Potrebno znanje: naredba učitavanja i ispisa podataka, naredba


odlučivanja (grananja)

Kategorija: ad hoc
HONI 2012/2013 Zadatak ČOKOLADA
4. kolo, 19. siječnja 2013. Autor: Adrian Satja Kurdija

Cijelo vrijeme pamtimo vrijednosti varijabli R i S koje nam predstavljaju


trenutni broj redova i stupaca čokolade.

Za svako od tri unosa oblika “K redova” ili “K stupaca” valja nam učitati broj
K i string A te provjeriti je li string A = “redova” ili A = “stupaca”.

U prvom slučaju upravo pojedeni broj kvadratića iznosi K * S, jer svaki od K


pojedenih redova čokolade trenutno sadrži S kvadratića. U drugom slučaju
pojedeni broj kvadratića iznosi K * R, jer svaki od K pojedenih stupaca
čokolade trenutno sadrži R kvadratića.

Dodatno, u prvom slučaju valja nam trenutni broj redova R umanjiti za K, a


u drugom slučaju trenutni broj stupaca S umanjiti za K.

Potrebno znanje: uspoređivanje stringova, naredba odlučivanja


(grananja), primjena osnovnih matematičkih operacija

Kategorija: ad hoc
HONI 2012/2013 Zadatak OREHNJAČA
4. kolo, 19. siječnja 2013. Autor: Nikola Dmitrović

Svaki gledatelj mislio je da će dobiti K - P + 1 komada orehnjače (toliko


je ukupno komada od onog s oznakom P do onog s oznakom K). Rješenje
prvog dijela zadatka svodi se dakle na određivanje maksimalne vrijednosti
izraza K - P + 1 koju izračunamo za svakog gledatelja.

Kako su gledatelji redom uzimali komade orehnjače, u nekom trenutku


moglo se dogoditi da gledatelj ne može uzeti komad koji je bio predviđen za
njega jer ga je uzeo netko prije njega. Zbog toga kreiramo niz maksimalne
duljine 1000 i svaki element inicijaliziramo na vrijednost 1 (svi komadi na
svom su mjestu). Za svakog gledatelja s oznakom i zbrojimo vrijednosti
u nizu na pozicijama od Pi do Ki, a svaku vrijednost 1 u tom intervalu
promijenimo u 0 (komad više nije na svom mjestu). Istovremeno pratimo i
pamtimo maksimalnu vrijednost navedenog zbroja.

Potrebno znanje: naredba ponavljanja (petlja), algoritam određivanja


maksimuma, niz

Kategorija: ad hoc
HONI 2012/2013 Zadatak ESEJ
4. kolo, 19. siječnja 2013. Autor: Ivan Mandura

Opišimo postupak određivanja je li riječ lijepa ili ne. Iterirajmo po riječi


s lijeva na desno te pamtimo niz slova koje još nismo uspjeli spariti.
Pretpostavimo da smo naišli na slovo A. Provjerit ćemo je li posljednje
nespareno slovo jednako A: ako jest, možemo ga spariti s novim slovom i
ukloniti ga iz niza nesparenih slova. Ako je pak posljednje nespareno slovo
jednako B, moramo i novo slovo A dodati u niz nesparenih slova (kad bismo
ga htjeli spariti s nekim ranijim slovom A, spomenuto slovo B nećemo nikad
uspjeti spariti jer će se njegov luk morati sjeći s novim lukom).

Primijetimo da je niz nesparenih slova koji održavamo zapravo stog (eng.


stack): struktura koja podržava operacije dodavanja elementa na kraj,
pristup elementu s kraja te njegovo uklanjanje. Ako je stog prazan nakon
što završimo s iteriranjem, riječ je lijepa.

Potrebno znanje: stringovi, stog

Kategorija: ad hoc
HONI 2012/2013 Zadatak VOYAGER
4. kolo, 19. siječnja 2013. Autor: Nikola Dmitrović

Rješenje zadatka svodi se na implementaciju navedenih uvjeta iz zadatka.


Opišimo neke specifičnosti rješenja.

U početku, sonda se nalazi na unaprijed zadanoj poziciji. Signal se počevši


od te pozicije mora poslati u sva četiri moguća smjera (gore, desno, dolje,
lijevo). Znači, moramo pamtiti početnu poziciju, trenutnu poziciju i smjer
kretanja. Kada signal na svom putu naiđe na planet, on treba promijeniti
svoj smjer kretanja. Smjer kretanja opisujemo dvjema vrijednostima:
pomakom po retku i pomakom po stupcu. Stoga kreiramo dva konstantna
niza duljine 4 na sljedeći način: RP[] = {-1, 0, 1, 0} i SP[] = {0, 1, 0, -1}.

Uočimo da je vrijednostima u nizovima na nultoj poziciji opisan pomak


prema gore, vrijednostima na prvoj poziciji pomak u desno, vrijednostima
na drugoj poziciji pomak prema dolje te vrijednostima na trećoj poziciji
pomak u lijevo. Nakon što na svakoj poziciji provjerimo vrijednost polja,
trebamo napraviti korekciju smjera. Ovo ponavljamo sve dok signal ne izađe
iz sustava ili dok ne naiđe na crnu rupu. Ako s pomakr i pomaks označimo
trenutni smjer kretanja (na početku inicijaliziramo pomakr na RP[i] i
pomaks na SP[i], za i=0..3) tada, ovisno o vrsti planeta na koji naiđemo,
promjenu smjera možemo postići na sljedeći način:

// za planet s oznakom "\"


ako je (pomakr=-1) i (pomaks=0) tada { pomakr:=0; pomaks:=-1; }
inače ako je (pomakr=0) i (pomaks=-1) tada { pomakr:=-1; pomaks:=0; }
inače ako je (pomakr=0) i (pomaks=1) tada { pomakr:=1; pomaks:=0; }
inače ako je (pomakr=1) i (pomaks=0) tada { pomakr:=0; pomaks:=1; }

// za planet s oznakom "/"


ako je (pomakr=0) i (pomaks=1) tada { pomakr:=-1; pomaks:=0; }
inače ako je (pomakr=0) i (pomaks=-1) tada { pomakr:=1; pomaks:=0; }
inače ako je (pomakr=1) i (pomaks=0) tada { pomakr:=0; pomaks:=-1; }
inače ako je (pomakr=-1) i (pomaks=0) tada { pomakr:=0; pomaks:=1; }
Postoji i jednostavniji način. Trenutni smjer kretanja promatramo kao jednu
vrijednost u oznaci d (d=0, gore; d=1, desno; d=2, dolje; d=3, lijevo).
Promjenu smjera postižemo korištenjem logičkog operatora ekskluzivno ILI
(XOR) na bitovima. Taj operator vraća vrijednost jedan ako su vrijednosti
operanada bile različite. Znajući tu činjenicu, promjenu smjera postižemo na
sljedeći način:

ako je (planet = '\') tada


d ^= 3
inače ako je (planet = '/') tada
d ^= 1;

Dokaz ove tvrdnje možemo provesti iscrpljivanjem. Pretpostavimo da je


trenutni smjer kretanja d=0, a planet u oznaci '\'. Binarni je zapis nule 00,
a trojke 11. Novi smjer kretanja tada je vrijednost operacije 00^11=11 tj.
novi je smjer 3. Lako se provjeri da je ovo istina za sve slučajeve.

Dodatni je problem određivanje situacije u kojoj signal upadne u ciklus. To


ćemo postići tako da brojimo polja koja smo posjetili. Budući da poruka kroz
neko polje može putovati u četiri smjera, a sustav ima N * M polja, postoji
ukupno 4 * N * M položaja u kojima se poruka može nalaziti. Kada neka
poruka prijeđe više polja od tog broja, očito je ponovo u nekom položaju
u kojem je bila prije. Idući položaj u kojem će se poruka naći ovisi samo o
njenom trenutnom položaju pa je poruka sigurno upala u ciklus.

Potrebno znanje: dvodimenzionalno polje

Kategorija: simulacija
HONI 2012/2013 Zadatak RAZLIKA
4. kolo, 19. siječnja 2013. Autor: Goran Gašić

Radi jednostavnosti, odredimo N - K brojeva koji će ostati u nizu. Time


implicitno određujemo K brojeva koje treba ukloniti.

Ključno je primijetiti da uvijek postoji neko optimalno rješenje u kojemu


odabiremo N - K uzastopnih brojeva u sortiranome nizu.

Dokaz. Neka su a i b vrijednosti najmanjeg i najvećeg odabranog broja u


nekom optimalnom rješenju. Razmotrimo dva slučaja:

1) Ako u sortiranome nizu ne postoji neodabran broj c u intervalu <a, b>,


odabran je neki podniz uzastopnih brojeva i dokaz je gotov.

2) Inače, od a i b odredimo onaj čija je najmanja apsolutna razlika s nekim


drugim odabranim brojem najveća. Uklonimo ga i umjesto njega odaberimo
c. Najveća apsolutna razlika M sada je nužno manja jer je b - c < b - a.
Uklanjanjem broja nismo povećali najmanju apsolutnu razliku m jer smo
uklonili veću ili jednaku od dvije razlike. Dodavanjem c razliku njegova
dva odabrana susjeda u sortiranome nizu dijelimo na dvije, stoga ni time
ne povećavamo m. Ovime smo dokazali da je svako optimalno rješenje
nizom transformacija moguće dovesti u formu niza uzastopnih brojeva u
sortiranome nizu.

Slijedi jednostavno rješenje vremenske složenosti O(N2) koje sortira niz, za


svaki njegov podniz duljine N - K računa najmanju i najveću razliku te vraća
najbolje rješenje. Ovo rješenje nosi čak 50% bodova.

Primijetimo da najveća razlika odgovara razlici rubnih elemenata podniza,


stoga je za svaki podniz možemo izračunati u konstantnoj vremenskoj
složenosti. Ako u strukturi poput balansiranog binarnog stabla održavamo
posljednjih N - K - 1 razlika uzastopnih elemenata niza, najmanju razliku
također možemo dobiti u konstantnoj vremenskoj složenosti, ali operacije
ubacivanja te izbacivanja imaju logaritamsku vremensku složenost. Ovime
ukupnu vremensku složenost spuštamo na O(N log N). Ovo rješenje nosi
70% bodova.
Primijetimo da su elementi niza ograničeni na interval od R cijelih brojeva,
zbog čega ih u vremenskoj složenosti O(N + R) možemo sortirati counting
sortom. Dovoljno je izračunati frekvenciju pojavljivanja svakog broja u
intervalu te jednim prolaskom po nizu frekvencija generirati sortiran niz.
Pogledajmo strukturu podataka u kojoj održavamo razlike uzastopnih
elemenata niza. Primijetimo da, ako je upravo ubačena razlika manja od
neke druge razlike u strukturi, ta druga nikada neće biti najmanja jer će
biti izbačena prije upravo ubačene. Stoga razlike možemo održavati u
monotonom redu s dva kraja (engl. monotone deque). Najmanja razlika
u promatranome podnizu bit će ona na početku reda. Budući da će N - 1
razlika uzastopnih elemenata biti ubačeno i izbačeno točno jednom, ovime
ukupnu vremensku složenost spuštamo na O(N + R) te ostvarujemo sve
bodove.

Potrebno znanje: monotoni red, counting sort

Kategorija: strukture podataka


HONI 2012/2013 Zadatak DLAKAVAC
4. kolo, 19. siječnja 2013. Autor: Anton Grbin

Zamislimo bolesne ljude u jednom danu kao objekt na kojem je definiran


operator *. Želimo da taj operator obavlja operaciju određivanja bolesnih
ljudi za sljedeći dan, na temelju neka dva prošla dana. Prvi dan (odnosno
nulte pacijente) označimo sa B. Drugi i svaki j-ti dan označimo sa K(j). Tako
imamo:

K(1) = B,
K(2) = B * K(1) = B * B.

Dan možemo promatrati kao niz nula i jedinica, tako da na i-tom mjestu
u nizu stoji 1 ako je taj dan i-ta osoba bila bolesna. Uz takvo pamćenje
bolesnih ljudi, operator * može se trivijalno implementirati u složenosti O(M
* M).

Promotrimo rješenje za treći dan:

K(3) = B * K(2) = B * B * K(1) = B * B * B = B3.

Ovdje smo uveli operator potencije kao skraćeno pisanje uzastopnog


množenja. Promotrimo svojstva ovog operatora u svjetlu zadatka.

Bi = Bi-1 * B

Ovo pravilo očigledno vrijedi jer smo potenciju definirali kao pokratu za
uzastopno množenje.

Bi * Bi = Bi+i

Može se provjeriti da je i ova relacija istinita za naš operator *. Budući da su


ostvarene pretpostavke za logaritamsko potenciranje, moguće je operaciju
obaviti u složenosti O(log K * M * M) gdje je K redni broj dana čije rješenje
tražimo.

Algoritam slijedi:
potencija(B, k) =
ako je k paran,
pola = potencija(B, k/2) ako k nije nula ili {0, 1, 0, 0, ..}
vrati pola * pola
ako je k neparan,
vrati potencija(B, k-1) * B

Ako k postane jednak 0, moramo vratiti objekt koji će biti neutralni element
za operator *. U našem slučaju to je niz koji ima jednu jedinicu na mjestu 1.
Ovo rješenje nosilo je sve bodove.

Zadatak se mogao riješiti i konstrukcijom usmjerenog netežinskog grafa


G. Brid između čvorova i, j postoji samo ako bolest i-tog građanina danas
uzrokuje bolest j-tog građanina sutra. Ova konstrukcija trivijalno se može
napraviti u složenosti O(M * M * M) na temelju init-pacijenata. Preciznije, za
svaki par i, j provjerimo postoji li init-pacijent k takav da vrijedi (i * k) % M
== j.

Ako u točno K koraka postoji put između nekog init-pacijenta i osobe a,


onda je osoba a bolesna K-ti dan. Ovu informaciju dobijamo potenciranjem
grafa susjedstva na K-tu potenciju.

Nažalost ovo rješenje nije dovoljno brzo jer je njegova složenost O(log K *
M * M * M) i nije nosilo sve bodove.

Potrebno znanje: nizovi, matematička analiza problema, logaritamsko


potenciranje

Kategorija: matematika
HONI 2012/2013 Zadatak AKVARIJ
4. kolo, 19. siječnja 2013. Autor: Gustav Matula

Površina ispod linije koja opisuje dno sastoji se od N - 1 trapeza. Pronaći


ćemo način računanja površine za jedan trapez i tada ga strukturama
podataka poboljšati za brz rad s više njih. Radi jednostavnosti računat ćemo
površinu nepoplavljenog dijela ispod razine vode h.

Za jedan trapez postoje tri slučaja:


1) Površina je vode iznad cijelog trapeza.
2) Površina je vode ispod oba gornja vrha trapeza.
3) Površina je vode između gornjih vrhova trapeza.

U prvom je slučaju površina jednaka površini cijelog trapeza.


U drugom je slučaju površina jednaka visini vode h.
U trećem slučaju površinu možemo računati po formuli oblika
A * h2 + B * h + C (izražavanje koeficijenata polinoma ostavljamo čitatelju
za vježbu).

Ako imamo više trapeza, za neku visinu h možemo ih podijeliti u skupine


po slučajevima. Iz prve nas skupine (koja odgovara prvom slučaju) zanima
suma svih površina, iz druge broj trapeza (ukupna površina u toj skupini
iznosi h * broj_trapeza), a iz treće suma pripadnih koeficijenata polinoma, iz
kojih onda dobivamo formulu za površinu te skupine.

Problem je brzo izračunati sumu za pojedinu skupinu. Ako za neki fiksni


h svaki trapez predstavimo kao točku (Hi, Hi+1), skupine su određene
pravokutnicima kao na slici.
Upite nad takvim 2D intervalima jednostavno možemo izvesti koristeći
2D logaritamsku strukturu. U svakom polju strukture pamtimo sumu
ukupnih površina, broj trapeza, te tri sume koeficijenata (A, B i C). Takvu
je strukturu relativno jednostavno održavati prilikom promjena visina, a
složenost je jednog upita O(log2 maxh). Ukupna je složenost algoritma O((N
+ M) log2 maxh).

Postoje i alternativna rješenja. Umjesto održavanja strukture trapeza


možemo održavati niz rješenja za svaki h. Za svaku visinu zanimaju
nas ista tri slučaja kao i prije. Ako imamo trapez (Hi, Hi+1) (neka je radi
jednostavnosti Hi <= Hi+1), on doprinosi intervalu [0, Hi] svojom ukupnom
površinom, intervalu (Hi, Hi+1) svojom formulom (vidi slučaj 3), a intervalu
[Hi+1, maxh] povećanjem broja trapeza za 1. Niz rješenja može se opet
ostvariti kao logaritamska struktura ili tournament stablo te je složenost
jedne operacije O(log maxh), dakle ukupno O(N log maxh).

Potrebno znanje: logaritamska struktura ili tournament stablo

Kategorija: geometrija, strukture podataka

You might also like