You are on page 1of 10

 

 
 
 
 
 
 
 
 

 
 
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​ : ad­hoc 
 
 
   
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 for­petlja, nizovi, stringovi 
Kategorija​ : ad­hoc 
 
   
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​ : ad­hoc 
 
   
 
 
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  O­V­N  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  ​­  ​

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, for­petlja 
Kategorija​ : ad­hoc 
 
   
 
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​ : ad­hoc 
 
   
 
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​ : ad­hoc 
 
   
 
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, ad­hoc 
 
   
 
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  prefiks­suma,  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  prefiks­sume1   nekog  drugog  niza  ​ b​,  onda  je  razlika  prefiks­suma 
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​ b​N   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 N­tog retka, pritom u 
varijablu ​suma​  pribrajajući sve elemente kojima prođe. 

1
K​
 ​­​
ta prefiks­suma 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 HONI­ju 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 
 

You might also like