You are on page 1of 9

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE

3. KOLO

RJEŠENJA
HONI 2010/11 Zadatak TABLICA

3. kolo, 11. prosinca 2010. Autor: Tomislav Grbin i Frane Kurtović

Kako postoje samo četiri moguća okretanja u desno, rješenje je izračunati


vrijednost svakog okretanja, te za okretanje koje daje najveću vrijednost ispisati
njegov redni broj, s tim da je potrebno paziti da ako ima više okretanja s najvećom
vrijednosti ispišemo ono s najmanjim rednim brojem.

Ako početna tablica izgleda kao što je to opisano u zadatku:

Tada sljedeća tri okretanja redom daju tablice:

Ove četiri tablice redom imaju vrijednosti (uključujući i početnu): ,

, , .

Primijetimo da vrijednost svake od ovih tablica možemo pomnožiti s konstantom


A * B * C * D te dalje računati isključivo s integerima, što bitno olakšava njihovu
usporedbu.

Potrebno znanje:

Uporaba osnovnih računskih operacija

Kategorija

Ad-hoc
HONI 2010/11 Zadatak ZBROJ

3. kolo, 11. prosinca 2010. Autor: Goran Gašić

Primijetimo da će Perica dobiti najmanji zbroj ako sve šestice u oba broja zapiše
kao petice. Analogno, dobit će najveći zbroj ako sve petice zapiše kao šestice.

Zadatak ćemo najjednostavnije riješiti ako brojeve učitamo kao nizove znakova te
promijenimo znakove na odreñenim pozicijama. Potom je dovoljno pretvoriti nizove
znakova u integere nekom od funkcija iz standardne biblioteke našega programskog
jezika.

Alternativno, najmanje i najveće brojeve A i B koje Perica može zapisati možemo


dobiti koristeći isključivo integere. Dovoljno je uzastopnim dijeljenjem s 10 odrediti
znamenke na svim pozicijama u oba broja te zamijeniti iste po potrebi.

Potrebno znanje:

Uporaba stringova, operacije na integerima

Kategorija

Ad-hoc
HONI 2010/11 Zadatak EKIPA

3. kolo, 11. prosinca 2010. Autor: Matija Osrečki

Kako bi se zadatak riješio na brz i jednostavan način, treba primijetiti jednu stvar.
Pošto se jedan student može natjecati u najviše jednoj disciplini, a u jednoj
disciplini se može natjecati više studenata i svaki student se prijavio za svaku
disciplinu, dovoljno je za svakog studenta odrediti disciplinu u kojoj je najbolji.
Onda nam jedino preostaje uzeti najboljih K studenata, usporeñujući njihova znanja
disciplina za koje su odreñeni.

Zašto to vrijedi? Upravo zato što se u svakoj disciplini može natjecati proizvoljan
broj studenata. Ako nekog studenta odredimo da će se natjecati u nekoj disciplini,
to ne ograničava nijednog drugog studenta da se natječe u bilo kojoj od disciplina,
već ograničava njega da se natječe u nekoj drugoj disciplini. Prema tome, za
svakog studenta treba odrediti disciplinu u kojoj je najbolji.

Implementirati se može na dva načina, prvi zahtjeva sortiranje, a drugi ne.

Prvi način:

Za svakog od studenta odredimo disciplinu u kojoj je najbolji. Kad smo to napravili


dobili smo niz koji predstavlja ocjenu znanja za svakog studenta. Jedino preostaje
taj niz sortirati i uzeti najboljih K studenata.

Vremenska složenost je O(N * M + N * log N). Memorijska složenost je O(N).

Drugi način:

Pošto su studenti po disciplinama već sortirani, to možemo iskoristiti. Za svaku


disciplinu imamo indeks koji na početku pokazuje na prvog (najboljeg) studenta. U
svakom od K koraka, prolazimo kroz sve discipline i odreñujemo jednu disciplinu čiji
indeks pokazuje na studenta sa više znanja od indeksa ostalih disciplina. Kad smo
odredili disciplinu, ocjenu znanja pribrojimo rezultatu i indeks za tu disciplinu
mičemo za jedno mjesto udesno. Treba primijetiti kako će se dogoditi da će neki
student već biti iskorišten, zbog čega treba pamtiti koje smo studente već uzeli, i
kad naletimo na takvog studenta samo ga preskočimo.

Vremenska složenost je O(N * M), a memorijska O(N * M).

Potrebno znanje:
Greedy, sortiranje (ne nužno ali pojednostavnjuje rješenje)

Kategorija

Greedy
HONI 2010/11 Zadatak ZNANSTVENIK

3. kolo, 11. prosinca 2010. Autor: Adrian Satja Kurdija

Treba primijetiti da, ako možemo obrisati K redaka s vrha tablice tako da svi stupci
ostanu meñusobno različiti, onda možemo obrisati i K-1 redaka za isti uvjet. Zbog
toga možemo maksimalan K pronaći binarnim pretraživanjem.

U binarnom pretraživanju ostaje nam dovoljno efikasno provjeriti možemo li za


odreñeni K obrisati prvih K redaka tako da svi stupci ostanu meñusobno različiti.
Primijetimo da, ako stupce čitamo kao stringove odozdo prema gore, isplati ih se
prije binarnog pretraživanja sortirati po abecedi (leksikografski). Zašto? Zato što
onda za bilo koji K možemo jednostavno provjeravati ima li jednakih stupaca tako
što ćemo provjeriti samo za susjedne stupce jesu li jednaki, budući da će stupci koji
su meñusobno jednaki sigurno biti na uzastopnim pozicijama u sortiranom nizu.

Složenost je opisanog rješenja najviše O(N2 * log N), gdje je N = max(R, S).

Alternativno, moguće je koristiti hashiranje pojedinih stupaca kako bismo


usporeñivanje stupaca sveli na usporeñivanje brojeva (i tako smanjili njegovu
složenost). Razradu ovog rješenja ostavljamo čitateljima za vježbu.

Potrebno znanje:

Binarno pretraživanje, usporeñivanje stringova, sortiranje, hashiranje

Kategorija

Binarno pretraživanje, stringovi


HONI 2010/11 Zadatak DIFERENCIJA

3. kolo, 11. prosinca 2010. Autor: Adrian Satja Kurdija

Ključna je dosjetka sljedeća: umjesto da računamo zbroj diferencija svih podnizova


uzastopnih elemenata u danom nizu, izračunat ćemo zbroj svih maksimuma tih
podnizova i od njega oduzeti zbroj svih minimuma tih podnizova. Nije teško
zaključiti da se radi o istom broju, jer je diferencija definirana kao razlika
maksimuma i minimuma u pojedinom podnizu, pa zaključak slijedi iz asocijativnosti
i komutativnosti zbrajanja. Ovdje ćemo opisati kako pronaći zbroj svih maksimuma,
dok zbroj svih minimuma pronalazimo potpuno analogno.

Ideja je sljedeća. Za svaki element u zadanom nizu izračunat ćemo: koliko ima
podnizova uzastopnih elemenata zadanog niza, takvih da je njihov maksimum
upravo taj element? Definirat ćemo, radi odreñenosti, da ako ima više maksimuma
u istom podnizu uzastopnih elemenata, onda uzimamo prvi od njih kao maksimum
tog uzastopnog podniza.

Ako je pozicija elementa na kojem se nalazimo jednaka K, a njegova vrijednost


jednaka X, želimo pronaći prvi element lijevo od njega čija je vrijednost veća ili
jednaka X i prvi element desno od njega čija je vrijednost strogo veća od X. Naime,
ako se ta dva broja lijevo i desno nalaze na pozicijama A i B redom, onda je X
maksimalni element u točno onim podnizovima uzastopnih elemenata kojima je prvi
element na poziciji izmeñu A+1 i K (uključivo) i posljednji element na poziciji
izmeñu K i B-1 (uključivo). Tih dakle uzastopnih podnizova ima točno (K-A)*(B-K),
budući da množimo broj načina da odaberemo prvi element podniza uzastopnih
elemenata (K-A) s brojem načina da odaberemo posljednji element podniza
uzastopnih elemenata (B-K). Stoga, zbroj maksimuma svih podnizova uzastopnih
elemenata povećavamo za X*(K-A)*(B-K).

Preostaje nam osmisliti algoritam za nalaženje prvog elementa lijevo od trenutnog


koji je od trenutnog veći ili jednak (a onda će ostali algoritmi za nalaženje prvog
elementa desno koji je strogo veći, ili prvog lijevo koji je manji ili jednak, ili prvog
lijevo koji je strogo manji, biti analogni). Prolazit ćemo po nizu slijeva na desno,
održavajući stog (eng. stack) parova (vrijednost, pozicija) za neke elemente niza
koje smo u stog ubacili. Taj ćemo stog održavati padajućim s obzirom na vrijednosti
elemenata u njemu. Kad se nañemo na elementu s vrijednosti X, on će s vrha stoga
izbaciti sve elemente strogo manje od X, i onaj element koji nakon toga ostane na
vrhu stoga upravo je traženi prvi lijevo koji je veći ili jednak X. Potom element s
vrijednošću X stavljamo na vrh stoga i prelazimo na sljedeći element po redu.
Potrebno znanje:

Monotoni stog

Kategorija

Strukture podataka
HONI 2010/11 Zadatak MONO

3. kolo, 11. prosinca 2010. Autor: Luka Kalinovčić

Označimo s P pravokutnik najmanje površine koji u potpunosti sadrži zadani


poligon. Presjecimo P najmanjim skupom okomitih pravaca koji prolaze kroz sve
vrhove poligona. Ovime smo poligon podijelili na pravokutnike te površinu poligona
možemo dobiti kao sumu površina dobivenih pravokutnika.

Primijetimo da površinu pojedinog pravokutnika možemo izračunati koristeći


formulu uključivanja-isključivanja. Ona je jednaka razlici površina iznad donje i
gornje stranice pravokutnika.

Nadalje, sumu njihovih površina možemo dobiti obilaskom poligona u smjeru


suprotnom od kazaljke na satu. Svakim nailaskom na vodoravni brid u sumu
pribrajamo površinu iznad njega, s predznakom ovisnim o smjeru u kojem ga
obilazimo. Kako ćemo po najgornjem bridu proći u lijevo, sve takve površine
pribrajat ćemo s negativnim predznakom.

Uzmimo neko polje unutar tablice kao potencijalno gornje lijevo rubno polje
pravokutnika P. Odredimo slovo na nekom od polja poligona odreñenim s P. Kako
bi promatrani poligon bio monoliteralan, na svim ostalim poljima poligona mora se
nalaziti isto slovo, tj. broj pojavljivanja istoga slova unutar poligona mora biti
jednak njegovoj površini.

Broj pojavljivanja odreñenoga slova unutar poligona možemo izračunati analogno


računanju površine. Jedina razlika je što ne pribrajamo površine, već brojeve
pojavljivanja zadanoga slova iznad vodoravnih bridova. Za svako slovo možemo
unaprijed izračunati matricu koja će nam osigurati da na takve upite odgovaramo u
konstantnoj složenosti.

Konačno, ukupan broj monoliteralnih poligona dobit ćemo provoñenjem opisanog


algoritma za svako polje unutar tablice. Složenost algoritma jest O(R * C * V).

Potrebno znanje:

Formula uključivanja-isključivanja

Kategorija

Računska geometrija

You might also like