You are on page 1of 10

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE 2011/2012
6. KOLO

OPISI ALGORITAMA
HONI 2011/2012 Zadatak GUŽVA
6. kolo, 14. travnja 2012. Autor: Nikola Dmitrović

Kako se promatra konačan broj automobila (5), dovoljno je učitati


svaku od zadanih vrijednosti (broj osoba u automobilu), za svaku
posebno provjeriti je li različita od vrijednosti 1 te u tom slučaju
povećati brojač za jedan. Tako dobivenu vrijednost brojača ispišemo
na izlaz.

Naravno, rješenje možemo realizirati i u kraćem obliku korištenjem


naredbe ponavljanja (petlje). Evo opisa:

koliko:=0;

za i:=1 do 5 radi
{
učitaj(x); // broj osoba u i-tom automobilu

ako je x<>1 tada


koliko:=koliko+1;
};

ispiši(koliko);

Potrebno znanje: naredbe učitavanja i ispisivanja, naredba


odlučivanja (grananja)

Kategorija: ad hoc
HONI 2011/2012 Zadatak IB
6. kolo, 14. travnja 2012. Autor: Nikola Dmitrović

Zadane zaključne ocjene za svaki predmet treba zbrojiti i tako saznati


ukupan zbroj zaključnih ocjena (1/3 vrijednosti test primjera). Na
osnovu tog zbroja, naredbom odlučivanja određujemo opisnu
zaključnu ocjenu. Dodatni je problem u detektiranju situacije kada je
učenik negativno ocijenjen. To možemo pratiti i detektirati prilikom
upisa podataka, u jednoj posebnoj varijabli.

Pseudokod:

pao:=0; zbroj:=0;

za i:=1 do 6 radi // može i bez naredbe ponavljanja


{
učitaj(razina, ocjena); // ovisno o jeziku

zbroj:=zbroj+ocjena;

ako je ocjena=1 tada pao:=1;

ako je (razina='N') i (ocjena=2) tada pao:=1;


};

ako je zbroj<=22 tada pao:=1;

ispiši(zbroj);

ako je pao=1 tada


ispiši('nedovoljan')
inače
ako je (zbroj=23) tada
ispiši('dovoljan')
inače
ako je (zbroj>=24) i (zbroj<=27) tada
ispiši('dobar')
inače
ako je (zbroj>=28) i (zbroj<=33) tada
ispiši('vrlo dobar')
inače
ispiši('odlican');

Potrebno znanje: naredbe učitavanja i ispisivanja, ugnježđena


naredba odlučivanja (grananja), naredba ponavljanja (petlja)
Kategorija: ad hoc
HONI 2011/2012 Zadatak JACK
6. kolo, 14. travnja 2012. Autor: Adrian Satja Kurdija

Ograničenje za N dovoljno je maleno da možemo isprobati sve


kombinacije triju karata (njih je manje od 100*100*100). Te
kombinacije možemo birati pomoću tri ugnježđene for-petlje: prva bira
poziciju prve karte u nizu, druga (unutar prve) bira poziciju druge
karte u nizu i konačno treća (unutar prve dvije) bira poziciju treće
karte u nizu.

Za svaku tako odabranu kombinaciju (u unutarnjoj petlji) treba


provjeriti je li zbroj dotičnih karata (elemenata niza) veći od M: ako
jest, s tim kartama ne činimo ništa, a inače provjeravamo je li njihov
zbroj veći od dosad najboljeg pronađenog zbroja: ako jest, ažuriramo
taj zbroj - kojeg nakon svega ispišemo.

Potrebno znanje: rad s nizom, ugnježđene for-petlje

Kategorija: ad hoc
HONI 2011/2012 Zadatak PROZORI
6. kolo, 14. travnja 2012. Autor: Adrian Satja Kurdija

Nakon učitavanja matrice znakova od 5M + 1 redaka i 5N + 1


stupaca, treba primijetiti da nam je za detektiranje vrste prozora
dovoljno gledati samo neka određena polja matrice. Preciznije,

- za 1. stupac prozora dovoljno je promatrati samo 2. stupac matrice;


- za 2. stupac prozora dovoljno je promatrati samo 7. stupac matrice;
- za 3. stupac prozora dovoljno je promatrati samo 12. stupac matrice;
...
- za K-ti stupac prozora dovoljno je promatrati samo 5K-3. stupac
matrice;
...
- za N-ti stupac prozora dovoljno je promatrati samo 5N-3. stupac
matrice.

Kad smo izdvojili jedan od gore navedenih stupaca matrice, u njemu


treba promatrati nizove od četiri polja nakon svakog ruba ‘#’. Broj
znakova ‘*’ u takvom nizu određuje vrstu dotičnog prozora.

Preciznije, for-petljom prolazimo po tom stupcu matrice. Kad naiđemo


na znak ‘#’, za svaki od sljedeća četiri znaka provjerimo je li jednak
‘*’. Broj tih zvjezdica (od 0 do 4), uvećan za 1, daje broj vrste
dotičnog prozora (od 1 do 5). Sad kad smo ustanovili vrstu prozora,
povećamo jedan od pet brojača koji nam broje količinu prozora svake
vrste. Tih pet brojača na koncu ispišemo.

Potrebno znanje: rad s matricama znakova

Kategorija: stringovi
HONI 2011/2012 Zadatak ZAGRADE
6. kolo, 14. travnja 2012. Autor: Bruno Rahle

Prvi je korak u rješavanju ovog zadatka pronalaženje odgovarajućih


parova zagrada. To je najlakše napraviti tako da prolazimo po nizu i
održavamo stog s otvorenim zagradama. Kada naiđemo na otvorenu
zagradu, na stog dodamo njezinu poziciju. Kada naiđemo na zatvorenu
zagradu, sa stoga uklonimo posljednju i ona će sa zatvorenom činiti
valjani par zagrada (dokaz ostavljamo čitatelju). Te dvije zagrade
označimo da čine par. Postoji nekoliko pogrešnih algoritama koji su, uz
uvjet da je ostatak rješenja točan, nosili 40% bodova.

Drugi je korak generiranje svih mogućih izraza. On se može lagano


riješiti na dva načina: rekurzijom ili bitmaskom. Rekurzija samo treba
odlučiti koje ćemo parove zagrada koristiti, a neka druga funkcija
može iz stringa samo izbaciti odgovarajuće parove zagrada i takav
izraz pohraniti u memoriju. Pseudokod rekurzije:

odaberi(koji_par, ukupno_parova, izbačeni_parovi):


ako koji_par = ukupno_parova:
pozovi napravi_izraz(izbačeni_parovi)
izađi van
dodaj koji_par u izbačeni_parovi
odaberi(koji_par+1, ukupno_parova, izbačeni parovi)
izbaci koji_par iz izbačeni_parovi
odaberi(koji_par+1, ukupno_parova, izbačeni parovi)

Rekurziju u ovom slučaju možemo zamijeniti bitmaskom, tj. iskoristiti


svojstvo da se prirodni brojevi u memoriji zapisuju u bazi 2. Ideja je
sljedeća: ako promatramo binarni zapis nekog broja, onda nam 0 na
mjestu i može označavati da ćemo ostaviti i-ti par zagrada u izrazu, a
1 da ćemo ga izbaciti. Npr. broj 5 (101 u bazi 2) bi nam mogao
označavati da ćemo izbaciti 1. i 3. par zagrada. Prolaskom po svim
brojevima od 0 do 2N - 1, gdje je N broj parova zagrada, možemo
generirati sve tražene izraze, jednako kao i rekurzijom. Dobar tutorial
o ovoj tehnici može se pronaći na TopCoderu:
http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=b
itManipulation

Treći je korak sortiranje dobivenih izraza i uklanjanje onih koji se


ponavljaju. Rješenje koje ne uklanja višestruke izraze dobiva 70%
bodova.
Potrebno znanje: rad sa stringovima, bitmaske ili rekurzija, stog

Kategorija: stringovi, sortiranje

HONI 2011/2012 Zadatak REZ


6. kolo, 14. travnja 2012. Autor: Anton Grbin

Potrebno je primjetiti da je najviše porcija izrezano upravo rezovima


čija su sjecišta jedinstvena - ne postoje tri reza koja se sijeku u istoj
točki.

S pretpostavkom o ovom općem položaju rezova možemo zapisati


formulu maksimalnog broja porcija u odnosu na korišteni broj rezova:

Kako bismo uz minimalan broj rezova odsjekli barem K porcija


potrebno je naći najmanji r za kojeg je . Budući da
je broj_porcija očito monotona funkcija, rješenje dobivamo binarnim
pretraživanjem.

Ispisivanjem samo dobivenog broja r natjecatelj dobiva 50% bodova.


Rekonstrukcija rješenja nije jedinstvena, a ovdje je dana
najjednostavnija.

Numerirajmo rezove brojevima od 1 do r. Neka i-ti rez bude određen


krajnjim točkama:
(5000 - i, -5000) --- (-5000, -5000 + i).
Svi uvjeti zadatka ovime su ispunjeni.

Potrebno znanje: binarno pretraživanje, geometrija ravnine

Kategorija: ad hoc
HONI 2011/2012 Zadatak PASTELE
6. kolo, 14. travnja 2012. Autor: Goran Gašić

Promotrimo vrijednost šarenila skupa pastela. Šarenilo iznosi

Sređivanjem izraza dobivamo da ono iznosi

Uzmemo li R, G i B vrijednosti boja pastela kao koordinate točaka u


3D, šarenilo je jednako najvećoj dimenziji najmanjeg kvadra koji
sadrži sve točke. Budući da je najveća koordinata relativno malena,
ovo nas vodi na rješenje koje provjerava broj točaka u svakom kvadru
te uzima najbolje rješenje od onih koji sadrže bar K točaka. Prije toga
je potrebno izračunati matricu pomoću koje, iskorištavanjem principa
uključivanja i isključivanja, na upit o broju točaka unutar kvadra
možemo odovoriti u konstantnoj složenosti. Takvo rješenje nosi 50%
bodova.

Budući da je šarenilo jednako najvećoj dimenziji kvadra, ništa ne


gubimo izjednačavanjem ostalih dimenzija s najvećom. Stoga je u
opisanom rješenju dovoljno promatrati kocke. Ova optimizacija donosi
dodatnih 30% bodova.

Treba primijetiti da, uz zadan vrh kocke, binarnim pretraživanjem po


duljini stranice možemo pronaći najmanju kocku s tim vrhom koja
sadrži bar K točaka. Ovime ostvarujemo sve bodove.

Potrebno znanje: binarno pretraživanje, princip uključivanja i


isključivanja

Kategorija: računska geometrija, pretraživanje


HONI 2011/2012 Zadatak KOŠARE
6. kolo, 14. travnja 2012. Autor: Gustav Matula

Svaku košaru jednostavno predstavimo odgovarajućom maskom (i-ti


bit je u jedinici u koliko je i-ta igračka u košari). Problem se svodi na
sljedeće: Koliko postoji podnizova niza maski iz ulaza čiji ukupni
bitwise-or daje masku sa svim jedinicama?

Jedan sporiji pristup koristi dinamičko programiranje tako da rješenje


izrazi funkcijom f( preostalo_maski, trenutni_or ). Takvo rješenje ima
složenost O( N * 2M ) i dobiva 50% bodova. Kompletnu razradu
rješenja neću navoditi, no implementacije možete pronaći među
natjecateljskim kodovima.

Za brže rješenje potrebna je sljedeća ideja. Neka je b[mask] broj


maski iz ulaza koje su podmaske od mask. Tada je broj podnizova
čiji je bitwise-or podmaska od mask jednak c[mask] = 2b[mask]
(svaku od b[mask] maski možemo uzeti ili ne uzeti u nekom
odabiru). Ako imamo niz c, iz njega rješenje lako dobijemo principom
uključivanja/isključivanja u složenosti O( 2M ).

No kako dobiti niz b? Uzmimo neku masku 1mask koja počinje


jedinicom (mask ovdje označava ostatak bitova). Recimo da smo
izračunali broj njenih podmaski koje počinju jedinicom. Preostaje nam
dodati podmaske koje počinju nulom, a to su upravo podmaske maske
0mask. Primijetite da pri računanju podmaski maske 0mask moramo
gledati samo maske koje počinju nulom (maska koja počinje jedinicom
nikako ne može biti njena podmaska). Ovo sugerira rekurzivan
pristup: riješimo problem rekurzivno za dvije polovice maski (pola ih
počinje nulom, a pola jedinicom), i zatim pribrojimo svakoj maski koja
počinje jedinicom rješenje odgovarajuće maske koja počinje nulom.

Složenost računanja niza b tada iznosi T( 2M ) = O( 2M ) + 2T( 2M-1 ) =


O( M * 2M ).

Ukupna je složenost rješenja O( NM + M * 2M ).

U implementaciji je moguće izbjeći korištenje principa


uključivanja/isključivanja tako da pri spuštanju u rekurziji računamo
niz b, na dnu izračunamo niz c, a pri povratku računamo rješenje. Za
detalje pogledajte izvorni kod.
Treba napomenuti da je algoritam za traženje niza b složenosti O( 3M )
(onaj koji naivno sumira sve podskupove) nosio 70% bodova.

Potrebno znanje: prikaz skupova bitmaskama, divide & conquer


paradigma, princip uključivanja/isključivanja

Kategorija: prebrojavanje

You might also like

  • Rjesenja PDF
    Rjesenja PDF
    Document6 pages
    Rjesenja PDF
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document6 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document7 pages
    Rjesenja
    mixa
    No ratings yet
  • Rjesenja
    Rjesenja
    Document5 pages
    Rjesenja
    mixa
    No ratings yet
  • Rjesenja
    Rjesenja
    Document7 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja PDF
    Rjesenja PDF
    Document7 pages
    Rjesenja PDF
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document6 pages
    Rjesenja
    mixa
    No ratings yet
  • Rjesenja
    Rjesenja
    Document7 pages
    Rjesenja
    deki20
    No ratings yet
  • Opisi Algoritama
    Opisi Algoritama
    Document5 pages
    Opisi Algoritama
    deki20
    No ratings yet
  • Opisi Algoritama
    Opisi Algoritama
    Document4 pages
    Opisi Algoritama
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document6 pages
    Rjesenja
    deki20
    No ratings yet
  • Kolo3 Zadaci
    Kolo3 Zadaci
    Document11 pages
    Kolo3 Zadaci
    deki20
    No ratings yet
  • Opisi Algoritama
    Opisi Algoritama
    Document4 pages
    Opisi Algoritama
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document10 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document10 pages
    Rjesenja
    deki20
    No ratings yet
  • Opisi Algoritama
    Opisi Algoritama
    Document7 pages
    Opisi Algoritama
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document9 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document9 pages
    Rjesenja
    deki20
    No ratings yet
  • Kolo2 Zadaci PDF
    Kolo2 Zadaci PDF
    Document10 pages
    Kolo2 Zadaci PDF
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document10 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document10 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document12 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document8 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document13 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document10 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document11 pages
    Rjesenja
    deki20
    No ratings yet
  • Rjesenja
    Rjesenja
    Document9 pages
    Rjesenja
    deki20
    No ratings yet
  • Kolo3 Zadaci PDF
    Kolo3 Zadaci PDF
    Document10 pages
    Kolo3 Zadaci PDF
    deki20
    No ratings yet
  • Mini Golf
    Mini Golf
    Document2 pages
    Mini Golf
    deki20
    No ratings yet