Professional Documents
Culture Documents
HRVATSKO OTVORENO NATJECANJE U INFORMATICI
6. kolo, 7. veljače 2015.
opisi algoritama
Zadatak PUDING Autor:
Mislav Bradač
Primijetimo da nam je lakše računati ako cijene iz ulaza podjelimo s 2 jer ćemo tako dobiti
dio cijene svakog proizvoda koji moramo platiti. Nakon toga ćemo izračunati koliko je
ostalo novaca Dominiku nakon što kupi pljeskavicu, krumpiriće i pitu. Još samo moramo
usporediti je li ostatak novaca dovoljan za kupnju pudinga od čokolade.
Potrebno znanje: računske operacije, uspoređivanje brojeva
Kategorija : adhoc
Zadatak VOICE Autor:
Adrian Satja Kurdija
Iz prvog retka unosimo mentore u niz. Potom u drugi niz unosimo mentore koji su se
okrenuli.
Redom za jednog po jednog mentora iz prvog niza (od najdražeg prema najmanje
dragom) provjeravamo je li se okrenuo, tj. nalazi li se u drugome nizu. Ako se nalazi,
odmah ga ispisujemo i završavamo potragu jer on je natjecateljev izbor. Ako nikoga nismo
pronašli među okrenutima, ispisujemo “Jao”.
Potrebno znanje: ugnježđena forpetlja, nizovi, stringovi
Kategorija : adhoc
Zadatak PAPRIKA Autor:
Ivan Paljak
Potrebno je simulirati postupak opisan u tekstu zadatka. Dakle, najprije simuliramo
zamjenu iskaznica između prve i druge paprike, zatim između druge i treće paprike, i tako
redom do kraja niza.
Nakon što smo obavili sve zamjene, valja prebrojati sve paprike koje žele biti ispunjene i
drže iskaznicu na kojoj je otisnut broj manji ili jednak
X, odnosno sve paprike koje žele biti
servirane svježe i drže iskaznicu na kojoj je otisnut broj strogo veći od X.
Ovaj algoritam radi u vremenskoj složenosti O(N) .
Potrebno znanje: simulacija, petlje, nizovi.
Kategorija : adhoc
Zadatak NIKO Autor: Marin Tomić
Označimo s o skup igrača koji mogu igrati samo u obrani, v skup igrača koji mogu igrati
samo u veznom redu, a s n skup igrača koji mogu igrati samo u napadu.
Označimo s on skup igrača koji mogu igrati i u obrani i u napadu. Analogno uvodimo
oznake, ov i
vn .
Konačno, označimo s ovn skup igrača koji mogu igrati u sve tri linije.
Za danu formaciju OVN potrebno je dobro rasporediti igrače. Očito ćemo igrače iz
skupova o
,
v i
n staviti u jedinu liniju u kojoj mogu igrati. Problem je odlučiti hoćemo li, ako
nemamo dovoljno isključivo obrambenih igrača, u obranu stavljati one koji mogu igrati i u
veznom redu ili one koji mogu igrati i u napadu.
Kao što to obično biva u programiranju, ne moramo donijeti odluku nego možemo isprobati
sve mogućnosti i viditi koja nam je najbolja.
Označimo s a broj igrača iz skupa on koje ćemo staviti u obranu. Onda ćemo on
a igrača
iz tog skupa staviti u napad.
Označimo s b broj igrača iz skupa vn koje ćemo staviti u vezni red. Onda ćemo vn
b
igrača iz tog skupa staviti u napad.
Označimo s c broj igrača iz skupa ov koje ćemo staviti u obranu. Onda ćemo ov
c igrača
iz tog skupa staviti u vezni red.
Sada kad tako rasporedimo igrače nedostaje nam još O o
a
c u obrani, V b (
ov
c) igrača
u veznom redu i N( on
a)(
vn
b) u napadu. Dakle, raspored je moguć samo ako je ovn
veći ili jednak sumi ta tri broja.
Sada je dovoljno isprobati sve mogućnosti za brojeve a,
b i
c
te ispisati “DA” ako neki
raspored uspije, a “NE” ako niti jedan uspije.
Potrebno znanje: kombinatorno razmišljanje, forpetlja
Kategorija : adhoc
Zadatak METEOR Autor:
Adrian Satja Kurdija
Valja izračunati pomak meteora u odnosu na njegovu početnu poziciju, tj. za koliko je polja
on pao prema tlu. Ako malo razmislimo, zaključujemo da je taj pomak jednak najmanjoj
vertikalnoj udaljenosti nekog dijela meteora od nekog dijela tla, umanjenoj za jedan. Tu
udaljenost računamo tako da za svaki stupac pronađemo najniži dio meteora i najviši dio
tla; njihova vertikalna razlika kandidat je za najmanju udaljenost.
Nakon što smo izračunali pomak, svaki dio meteora valja pomaknuti. To je najlakše učiniti
korištenjem nove fotografije (matrice znakova) u koju najprije prepišemo sve dijelove tla,
ostatak ispunimo točkama, a potom dodamo dijelove meteora na izračunata mjesta.
Potrebno znanje: stringovi, matrice
Kategorija : adhoc
Zadatak KRATKI Autor: Dominik Gleich
Ključ pri rješavanju ovog zadataka je primijetiti da u bilo kojem nizu duljine N mora
postojati monotoni podniz duljine barem sqrt(N). Zašto je to tako?
Pokušajmo to dokazati.
Zamislimo da imamo skup stackova poslaganih s lijeva na desno, sa svojstvom da su
brojevi prema vrhu stacka rastući.
Sada radimo sljedeći algoritam, prolazimo po brojevima u nizu s lijeva na desno, stavljajući
svaki broj na vrh prvog stacka s lijeva na koji možemo tako da nam još uvijek vrijedi
svojstvo da su brojevi na svim stackovima rastući.
Promatrajmo prvi slučaj: na kraju ovog algoritma imamo manje ili jednako od sqrt(N)
nepraznih stackova. U tom slučaju mora postojati stack koji ima više ili jednako od sqrt(N)
brojeva na sebi, jasno slijedi iz toga da je broj brojeva na stackovima ukupno točno N. U
ovom slučaju smo pokazali da je barem rastući podniz duljine sqrt(N).
Promatrajmo sada drugi slučaj: na kraju ovog algoritma imamo više od sqrt(N) nepraznih
stackova. Promatrajmo element na vrhu svakog stacka. Primijetimo da su brojevi na vrhu
stackova padajući, gledajući s lijeva na desno. U slučaju da nisu padajući to bi značilo da
se nismo držali naših svojstva konstrukcije prilikom izvršavanja ovog algoritma, jer smo
stavljali na prvi stack na koji možemo tako da je sljedeći broj veći od zadnjeg na stacku, i
to je prvi stack na koji ga možemo staviti. S time na umu, imamo padajući podniz duljine
barem sqrt(N) koji čine brojevi na vrhu svih stackova.
Time je dokaz završen. Uvijek postoji monotoni podniz duljine barem sqrt(N).
Nakon ovoga vrlo je jednostavno vidjeti da sljedeća konstrukcija daje monotoni niz tražene
duljine K, s pretpostavkom da je K >= sqrt(n), jer u protivnom ne postoji takav niz.
Neka niz ima ovaj oblik [n k + 1, n] [n 2k + 1, n k] [n 3k + 1, n 2k], itd.
Svaki ovaj podniz duljine K ima rastući podniz duljine K, a s obzirom da takvih podniza ima
<= K, jer je K >= sqrt(N) ne postoji padajući podniz duljine veće od K.
Potrebno znanje: for petlja
Kategorija : adhoc
Zadatak NEO Autor:
Ivan Paljak
Krucijalno je naslutiti da vrijedi sljedeća tvrdnja:
Matrica A je izrazito kul ako i samo ako je svaka njena podmatrica dimenzija 2x2 kul.
Shodno tome, možemo izgraditi novu matricu u kojoj je element na lokaciji [i][j]
B
postavljen na 1 ako je A[i][j] + A[i+1][j+1] <= A[i][j+1] + A[i+1][j] .
Rješavanje zadatka tada se svodi na traženje pravokutnika najveće površine u matrici B
koji se sastoji isključivo od jedinica. Vjerujemo kako je ovaj problem natjecateljima dosta
poznat pa nećemo ulaziti u detaljniju analizu. Ovisno o složenosti implementacije na
zadatku je bilo moguće osvojiti 40%, 60% ili 100% redom za vremenske složenosti O(n^4),
O(n^3), O(n^2).
Gore navedenu slutnju dokazujemo matematičkom indukcijom. Najprije zapišimo definiciju
kul matrice kao A
(1, 1)
A(1, s) <= A(r, 1)
A(r, s).
Dokazujemo slabiju tvrdnju:
Matrica A dimenzija 2x s je izrazito kul ako je svaka njena 2x2 podmatrica kul.
Radimo indukciju po s.
Baza: s = 2, vrijedi jer je svaka 2x2 kul matrica odmah i izrazito kul.
Korak: Pretpostavimo da postoji neki s takav da za njega tvrdnja vrijedi. Promatrajmo što
se tada događa s matricom dimenzija 2x(s+1).
Budući da je svaka 2x2 podmatrica kul vrijedi A(1, s)
A(1, s + 1) <=
A(r, s)
A
(r, s + 1),
dok iz pretpostavke znamo da A(1, s')
A(1, s) <= A(r, s') A (r, s) za svaki s' < s. Zbrojimo
li ove nejednakosti dobivamo A(1, s')
A(1, s + 1) <= A (r, s') A(r, s + 1) za svaki s' <= s.
Zaključujemo da ako tvrdnja vrijedi za matricu dimenzija 2xs, tada mora vrijediti i za
matricu dimenzija 2x(s+1). Odnosno, načelom matematičke indukcije dokazali smo da
tvrdnja vrijedi za svaki s >= 2.
Analogno možemo ovakav dokaz sprovesti po retcima na način da fiksiramo neka dva
stupca i razvijemo indukciju po retcima. Formalni nastavak dokaza ostavljamo čitateljici za
vježbu.
Potrebno znanje: matematička indukcija, traženje najvećeg pravokutnika u matrici
Kategorija : matematika, adhoc
Zadatak WTF Autor:
Adrian Satja Kurdija
Algoritam opisan u tekstu zadatka na prvi je pogled besmislen. Treba ga stoga razotkriti i
svesti na nešto smislenije; to činimo nizom dovitljivih zaključaka.
Najprije primijetimo da se, bez obzira na vrijednost konstante R, nakon N rotacija niz vraća
u svoje prvotno stanje. To znači da drugi dio algoritma kreće od istog niza kao prvi dio
algoritma, osim što su predznaci promijenjeni. No umjesto da promijenimo predznake, u
drugom dijelu algoritma možemo sumu smanjivati (umjesto povećavati) za A[indeks] .
Efektivno dakle prvi i drugi dio algoritma rade s identičnim nizovima.
Sljedeći je korak ignoriranje rotacije. Umjesto da zamišljamo jedan niz A koji se rotira,
možemo zamišljati N različitih nizova (izračunatih rotacijom niza A) na kojem rade prvi i dio
algoritma. Na i
tom od tih nizova (nazovimo ga a) prvi i drugi dio algoritma zajedno
izvršavaju sljedeće:
suma += a[id1] a[id2 + 1],
pri čemu je
id1manji, a
id2veći od dvaju indeksa ID[i], ID [i+1] . Gornja razlika
podsjeća nas na razliku prefikssuma, osim što razliku treba obrnuti. Mijenjanjem
predznaka svim elementima niza a
dobivamo poznatiju relaciju:
suma += a[id2 + 1] a[id1].
Naime, ako niz a sadrži prefikssume1 nekog drugog niza b, onda je razlika prefikssuma
zbroj odgovarajućeg intervala niza b. Točnije,
a[id2 + 1] a[id1] = b[id1] + ... + b [id2].
Članove niza b za koje vrijedi gornja formula računamo jednostavnom formulom b
[i] =
a[i + 1] a[i] . Primijetimo da niz b ima N 1 elemenata.
Rezimirajmo: dani algoritam zapravo zbraja neke intervale u nizovima b , …,
1 bN koje
znamo konstruirati. Ali ne bilo kakve intervale: intervali u susjednim nizovima su
[
ID[i], ID[i+1]] te
[ ID[i+1], ID [i+2]]
(nakon što ih ispravno orijentiramo, od manje do veće granice). Ti intervali imaju
zajednički rub (
ID [i+1]) . Ako nizove b1
, …, bN
zamislimo kao retke matrice, slijedi da
algoritam zapravo zbraja put u toj matrici koji prođe intervalom od ID[1] do ID[2] u prvom
retku, spusti se u drugi redak, u njemu prođe intervalom od ID [2] do ID[3], spusti se u treći
redak, u njemu prođe intervalom od ID[3] do ID[4], i tako dalje sve do Ntog retka, pritom u
varijablu suma pribrajajući sve elemente kojima prođe.
1
K
ta prefikssuma niza
b
jednaka je zbroju prvih K 1 elemenata od
b
.
Zadatak se dakle svodi na traženje optimalnog puta po matrici koji u svakom retku prođe
nekim intervalom s lijeva na desno ili s desna na lijevo, spusti se u sljedeći redak i
nastavlja. To je pravi zadatak, a sve ostalo bila je kamuflaža.
A taj zadatak (koji bi na HONIju bio težine 6.) rješavamo dinamičkim programiranjem.
Stanje je pozicija (redak, stupac) na kojoj se nalazimo i posljednji korak puta (lijevo, desno
ili dolje). Ako je posljednji korak bio lijevo, sljedeći korak ne može biti desno i obrnuto.
Detalje razradite za vježbu ili pogledajte priloženi kod.
Potrebno znanje: skidanje šminke sa zadatka, dinamičko programiranje
Kategorija : dinamika