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

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE

2. KOLO

OPISI ALGORITAMA
HONI 2011/2012 Zadatak VLAKIĆ
2. kolo, 19. studenog 2011. Autor: Adrian Satja Kurdija

Najprije izračunajmo brojeve djece u skupinama A i B koristeći


sljedeće formule:

A = N div 2 (N podijeljeno na 2, zaokruženo niže)


B = N - A (ostatak djece)

Nakon toga izračunajmo koliko vlakića treba prvoj skupini. Ako je A


djeljiv s M, trebat će točno A/M vlakića. Ako nije, trebat će jedan vlakić
više (A div M + 1).

Analogno izračunamo broj vlakića za skupinu od B djece. Na koncu


ispišemo zbroj (ukupan broj vlakića).

Potrebno znanje: unos i ispis cijelih brojeva, jednostavne računske


operacije

Kategorija: ad hoc

HONI 2011/2012 Zadatak ULICA


1. kolo, 22. listopada 2011. Autor: Goran Gašić

Neka je x redni broj Mirkove kuće na njegovoj strani ulice, a y redni


broj Slavkove kuće na njegovoj strani ulice. Redni broj kuće jednak je
(kućni broj + 1) div 2. Rješenje je onda |x - y| ako su Mirkova i
Slavkova kuća na istoj strani ulice, a |x - y| + 1 ako su na različitim
stranama ulice (jer Mirko treba prijeći cestu).

Potrebno znanje: unos i ispis cijelih brojeva, jednostavne računske


operacije

Kategorija: ad hoc
HONI 2011/2012 Zadatak NAJBOLJIH 5
1. kolo, 22. listopada 2011. Autor: Nikola Dmitrović

Zadatak je moguće riješiti na nekoliko načina. Pored očekivanog


načina traženja pet zadataka koji u zbroju bodova daju maksimalnu
vrijednost, uočimo da je u ovom slučaju možemo pronaći tri zadatka
koji u svojem zbroju daju najmanju vrijednost te pamtiti njihovu
oznaku.

min=ukupno; //ukupno je zbroj vrijednosti svih zadataka

za i=1 do 6 radi
za j=i+1 do 7 radi
za k=j+1 do 8 radi
ako su bodovi[i]+bodovi[j]+bodovi[k] < min tada
begin
min:=bodovi[i]+bodovi[j]+bodovi[k];
prvi:=i;
drugi:=j;
treci:=k;
end;

ispiši (ukupno-min);

za i=1 do 8 radi
ako je (i != prvi) i (i != drugi) i (i != treci) tada
ispiši (i);

Potrebno znanje: višestruka for petlja, algoritam traženja minimuma

Kategorija: ad hoc
HONI 2011/2012 Zadatak OKRET
2. kolo, 19. studenog 2011. Autor: Adrian Satja Kurdija

Treba primijetiti da u zadanome gradu ima slijepih ulica ako i samo


ako postoji slobodno polje koje ima samo jedno susjedno slobodno
polje.

To možemo i dokazati. Jedan smjer je jednostavan: ako postoji


slobodno polje (nazovimo ga A) sa samo jednim susjedom (nazovimo
ga B), onda smo, krenuvši iz B u A, “zaglavili” u A - iz njega se ne
možemo vratiti u B osim okretanjem za 180 stupnjeva, što znači da
ima slijepih ulica.

Ako pak ne postoji slobodno polje sa samo jednim susjedom, onda iz


svakog polja u koje uđemo možemo izaći drugim putem. Krenimo iz
bilo kojeg slobodnog polja u bilo kojem smjeru i krećimo se na sljedeći
način: kad god uđemo u neko polje, izađimo iz njega nekim drugim
putem. Budući da ima konačno mnogo slobodnih polja, kad-tad ćemo
ući u već posjećeno polje. Prvi put kad se to dogodi, možemo zaključiti
da vrijedi: ili smo se vratili u polazno polje, ili se možemo iz tog
“ponovljenog” polja vratiti u polazno polje istim putem kojim smo u
“ponovljeno” polje došli iz polaznog polja prvi put. U svakom se slučaju
možemo vratiti u polazno polje, čime je dokaz završen.

Opisano rješenje vrlo je jednostavno implementirati: za svako


slobodno polje prebrojimo koliko ono ima slobodnih susjeda (od
mogućih 4).

Potrebno znanje: rad s matricama

Kategorija: ad hoc
HONI 2011/2012 Zadatak ZADAĆA
1. kolo, 22. listopada 2011. Autor: Ivan Katanić

Najveći zajednički djelitelj dva broja možemo definirati i kao umnožak


svih zajedničkih prostih faktora:

A = p1a1 * p2a2 * … * pnan B = p1b1 * p2b2 * … * pnbn


NZD( A, B ) = p1min(a1,b1) * p2min(a2,b2) * … * pnmin(an,bn)

gdje su p1..pn prosti faktori, a1..an i b1..bn pripadajući eksponenti.


Faktorizaciju velikih brojeva A i B ćemo dobiti tako što ćemo
faktorizirati svaki od njegovih ulaznih manjih brojeva i jednostavno
zbrojiti sve eksponente za određeni prosti broj, jer je množenje
potencija upravo zbrajanje njihovih eksponenata. Nakon toga nam
preostaje samo direktno izračunati gornji izraz za NZD. Za detalje
pogledajte priloženi kod.

Drugo rješenje je isprobati sve parove ulaznih brojeva Ai i Bj naći


njihov NZD Euklidovim algoritmom te ga dodati u rezultat(pomnožiti),
a brojeve Ai i Bj podijeliti njime jer smo iskoristili pripadajuće proste
faktore.

Potrebno znanje: faktorizacija, prosti brojevi

Kategorija: teorija brojeva


HONI 2011/2012 Zadatak KOMPIĆI
2. kolo, 19. studenog 2011. Autor: Adrian Satja Kurdija

Treba primijetiti da je za svaku od unesenih vrijednosti važno samo


koji skup znamenaka ta vrijednost sadrži, tj. da nam nije bitan
redoslijed niti broj pojavljivanja tih znamenaka. Unesenoj vrijednosti
pridružimo niz od 10 nula ili jedinica koji nam predstavlja skup njezinih
znamenaka: ako npr. unesena vrijednost sadrži znamenku 4, onda će
na 4. mjestu u tom nizu biti jedinica, a inače nula.

Primijetimo da mogućih nizova od 10 nula ili jedinica ima najviše 210 =


1024. Za svaki od tih nizova (koje predstavljamo binarnim brojevima
od 0 do 1023) spremit ćemo broj unesenih vrijednosti (od ukupno N)
koje generiraju upravo taj binarni niz.

Za svaki par binarnih nizova možemo vrlo jednostavno reći imaju li


zajedničku znamenku - to će biti slučaj ako imaju barem jednu jedinicu
na istoj poziciji. Ako nemaju, onda tu nema kompića. Ako imaju, onda
par kompića čini bilo koja vrijednost koja generira prvi od ta dva
binarna niza, i bilo koja vrijednost koja generira drugi od ta dva
binarna niza, pa rješenje uvećavamo za

broj_vrijednosti[ niz1 ] * broj_vrijednosti[ niz2 ].

Preostaje prebrojati kompiće koji generiraju isti binarni niz, pa za svaki


generirani binarni niz u rješenje dodajemo

broj_vrijednosti[ niz1 ] * (broj_vrijednosti[ niz1 ] - 1) / 2

jer je upravo to broj parova koje možemo izabrati od broj_vrijednosti[


niz1 ].

Složenost algoritma odgovara biranju svih mogućih parova binarnih


nizova duljine 10 - tih parova ima oko 1024 * 1024.

Potrebno znanje: binarni brojevni sustav

Kategorija: ad hoc
HONI 2011/2012 Zadatak FUNKCIJA
1. kolo, 22. listopada 2011. Autor: Goran Gašić

Primijetimo da petlje predstavljaju skup nejednakosti:

X1 ≤ a ≤ Y1

X2 ≤ b ≤ Y2

XN ≤ <N-to> ≤ YN

Rješenje problema jednako je broju rješenja zadanog skupa


nejednakosti modulo 1000000007.

Izgradimo graf s N čvorova, koji predstavljaju zadane nejednakosti. Iz


čvora koji predstavlja nejednakost za var1 izgradit ćemo usmjereni
brid do čvora koji predstavlja nejednakost za var2 ako je donja ili
gornja granica za var2 jednaka var1.

Dobiveni graf je disjunktna unija usmjerenih, ukorijenjenih stabala.


Budući da su varijable u različitim stablima međusobno nezavisne, broj
rješenja skupa nejednakosti jednak je umnošku broja rješenja za
skupove nejednakosti određene pojedinim stabalima. Pokažimo sada
kako izračunati broj rješenja za jedno stablo.

Neka je f(korijen) jednako broju rješenja skupa nejednakosti


određenim stablom u korijenu. Neka je g(čvor, broj) jednako broju
rješenja skupa nejednakosti određenim podstablom u čvoru, ako je
varijabilna granica za nejednakost čvora jednaka broju. Vrijedi
sljedeće:

za nejednakost s varijabilnom donjom granicom, te analogno u


drugom slučaju. Ovime problem rješavamo u složenosti O(NM2), gdje
je M vrijednost najveće gornje granice, za što dobivamo 70% bodova.
Treba uočiti da vrijedi

za nejednakost s varijabilnom donjom granicom, te analogno u


drugom slučaju. Koristeći ovu činjenicu, složenost algoritma spuštamo
na O(NM), što je potrebno za ostvariti sve bodove.

Potrebno znanje: primjena dinamičkog programiranja

Kategorija: dinamičko programiranje, teorija grafova


HONI 2011/2012 Zadatak RASPORED
2. kolo, 19. studenog 2011. Autor: Gustav Matula

Recimo da imamo zadanu neku permutaciju (redoslijed pečenja) pizza


i da želimo izračunati napojnicu koju ona daje. Tada dobivamo
sljedeću sumu:

I dolazimo do zaključka kako poredak s obzirom na rokove uopće nije


bitan, a poredak s obzirom na vremena pečenja mora biti rastući kako
bi se pizze s većim vremenom zbrajale s manjim koeficijentom.

Brute force rješenje koje nakon svake promjene dovodi pizze po


vremenu pečenja i izračuna sumu u ukupnoj složenosti O(N log N) ili
O(N) donosilo je 50 bodova.

Dodatno ograničenje na iznos Vi u tekstu zadatka bio je svojevrstan


hint koji vodi u smjeru jednog jednostavnog rješenja: u nekom polju
cnt možemo u cnt[x] pamtiti koliko trenutno pizza ima vrijeme
pečenja jednako x. Za Vi do 1000 lako je odgovor na svaki upit
računati u maksimalno 1000 koraka (prolaz kroz polje cnt). Ovakav
algoritam nosio je 80 bodova.

Uporabom neke brze strukture podataka, primjerice logaritamske


strukture (BIT), za implementaciju polja cnt i niza pomoću kojeg
pratimo sume Vi (sum[x] = cnt[x]*x). Sada primjerice ako brišemo
vrijeme Vp za neku pizzu p iz strukture, rješenje se povećava za

Nakon toga cnt[Vp] smanjujemo za 1 a sum[Vp] smanjujemo za Vp.


Za dodavanje vremena Vp radimo isti postupak samo s drugim
predznakom i redoslijedom (prvo promijenimo cnt i sum a zatim
računamo smanjenje rješenja. Sume Ri mijenjaju se trivijalno i za to
nisu potrebne strukture podataka.
Složenost odgovaranja na jedan upit je O(log maxV), pa je ukupna
složenost jednaka O((N+P) log maxV) i dovoljno je dobra za svih
100% bodova.

Postoji alternativno rješenje koje ne ovisi o maxV. Ideja je održavanje


sortiranog niza svih vremena pečenja, kao i sume s pripadajućim
koeficijentima. To se može realizirati balansiranim stablom (on-line
rješenje) kao i logaritamskom strukturom izgrađenom nad sortiranim
nizom svih vremena (uključujući i promjene) u zadatku (offline
rješenje).

Složenost ovog algoritma je O((N + P) log (N + P)). Primjer offline


verzije ovog algoritma priložen je kao službeno rješenje.

Potrebno znanje: matematička analiza problema, strukture podataka

Kategorija: strukture podataka

You might also like