You are on page 1of 7

Zadatak DOMAĆICA Autor: Nikola Dmitrović

Domaćica je savršena ako je broj keksa svakog od oblika paran. Naime, jedino će u
tom slučaju, tijekom sparivanja istih oblika kutija moći ostati prazna.

Rješenje (pisano u Python 3.x)

T = int(input()) 

K = int(input()) 

E = int(input()) 

S = int(input()) 

P = int(input()) 

if T%2 == 0 and K%2 == 0 and E%2 == 0 and S%2 == 0 and P%2 == 0:    

    print("savrsena") 

else: 

    print("normalna")  

potrebno znanje: ​
naredba odlučivanja

kategorija: ​
ad-hoc

Zadatak PRINC Autor: Tonko Sabolčec

Odredimo prvo broj čitanja. Ako knjiga ima S stranica i na svakom čitanju
pročitamo B stranica, broj čitanja X će biti broj S/B zaokružen na gore (na prvi cijeli
broj veći ili jednak broju S/B). Sada je broj dana koje će proći između prvog dana
čitanja i posljednjeg dana čitanja jednak R = (X-1) * A.

Radi lakšeg računanja, označimo brojem P dan početka čitanja - s 0 označimo


ponedjeljak, 1 utorak, ... 6 nedjelju. Nakon R dana bit će dan (P+R) modulo 7
kojeg je potrebno pretvoriti u niz znakova (0 - ponedjeljak, ... 6 - nedjelja).

Za implementacijske detalje pogledajte službeno rješenje.


 

potrebno znanje: ​
Baratanje s osnovnim aritmetičkim operacijama, naredba
odlučivanja

kategorija: ​
ad-hoc

Zadatak ZAMKA Autor: Nikola Dmitrović

Za svaki prirodan broj veći ili jednak od L treba odrediti zbroj znamenki i provjeriti
je li zbroj jednak zadanom broj X. Pretraga se zaustavlja čim se pronađe prvi takav
broj (N). Za svaki prirodan broj manji ili jednak od D treba odrediti zbroj znamenki i
provjeriti je li zbroj jednak zadanom broj X. Pretraga se zaustavlja čim se pronađe
prvi takav broj (M).

Rješenje (pisano u Python 3.x)

lijevi = int(input()) 
desni = int(input()) 
X = int(input()) 
 
for i in range(lijevi, desni + 1): 
zbroj = 0 
kopija = i 
while i > 0: 
      zbroj += i % 10 
      i //= 10 
if zbroj == X: 
      print(kopija) 
      break 
 
for i in range(desni, lijevi ­ 1, ­1): 
zbroj = 0 
kopija = i 
while i > 0: 
      zbroj += i % 10 
      i //= 10 
if zbroj == X: 
      print(kopija) 
      break 
potrebno znanje: ​
naredba ponavljanja - for i while, algoritam za zbrajanje
znamenki
kategorija: ​
ad-hoc

Zadatak MULTIGRAM Autor: Mislav Balunović

Neka je zadan neki string duljine ​N​.


Možemo proći po svim djeliteljima ​ K broja ​N te provjeriti je li moguće da se string
sastoji od anagrama duljine ​ K​.
Kako bismo to provjerili moramo utvrditi jesu li podstringovi [1, K], [K+1, 2K], …,
[N-K+1, N] međusobno anagrami.
Dovoljno je sortirati sve te stringove i provjeriti jesu li tada jednaki.

potrebno znanje: ​ stringovi


kategorija: ​
ad-hoc
Zadatak PERICA Autor: Dominik Gleich

Potrebno je izračunati koliko puta se svaki broj u ulazu pojavljuje kao najveći od ​ K
brojeva u svim kombinacijama. ​ Sortiramo li brojeve uzlazno, vidimo kako će taj
broj biti maksimalan u nizu od ​ K brojeva, ​ako su svi ostali brojevi lijevo od njega.
Dakle, broj na ​i​
-tom ​mjestu je maksimalan u točno broj načina da odaberemo ​ K-1
brojeva u prvih ​i brojeva. Označimo li s f(n, k) broj načina da odaberemo ​ K​brojeva
od ​
N​ brojeva onda je lako uvidjeti da je f(n, k) = f(n-1, k) + f(n-1, k-1).
Koristeći se s ovom relacijom možemo izračunati svaki f(n, k).
Rješenje je dakle suma umnožaka pripadajućih f(i, k-1) i v[i], gdje je v[i] vrijednost
na tom mjestu.

potrebno znanje: ​kombinatorika


kategorija: ​
ad-hoc, matematika
Zadatak POPLAVA Autor: Mislav Balunović

Primijetite prvo da je u histogramu sa ​N​ stupaca maksimalna količina vode koja se


nalazi u njemu točno (​ N​- 1) * (​
N​- 2) / 2.
Konfiguracija u kojoj se to postiže je npr. [N, 1, 2, …, N - 2, N - 1].

Glavna ideja rješenja je izbaciti nekoliko stupaca iz sredine te ih posložiti padajuće


sa strane. Tada bi ukupna količina vode ovisila samo o stupcima koji su ostali u
sredini. Stupac visine h u sredini bi doprinosio sa N - 1 - h vode.

Pretpostavimo da smo u sredini ostavili stupce visina h​, h​


1​ , …, h​
2​ .
k​
Ako označimo sa v​ i​= N - 1 - h​, onda smo problem sveli na traženje nekog
i​
podskupa brojeva {1, 2, …, N - 2} čija je suma točno X.
Takve brojeve možemo pronaći pohlepnim algoritmom, a dokaz te tvrdnje
ostavljamo čitatelju za vježbu.

potrebno znanje: ​
greedy, matematika
kategorija: ​
matematika
Zadatak OOP Autor: Dominik Gleich

Kako bismo riješili zadatak pokušajmo prvo vidjeti kako možemo usporediti uzorak i
riječ. S obzirom da “*” zamijenjujemo s bilokojim nizom slova, a slova lijevo i
desno od “*” ostaju nepromijenjena, sve ono što je lijevo od “*” mora biti prefiks
od riječi s kojom uspoređujemo, a sve ono što je desno mora biti sufiks riječi s
kojom uspoređujemo. Dakle, ukoliko s L označimo sve lijevo od “*”, i s R označimo
sve desno od “*”, dovoljno je provjeriti da je L prefiks od riječi, da je R sufiks od
riječi i da je zbroj duljina L i R <= duljini riječi. U slučaju da to ne vrijedi onda bi
moglo doći do preklapanja prefiksa i sufiksa, npr. (“ab*ba” s “aba”, “ab” i “ba”
dijele slove u “aba”). Sada znamo riješit zadatak za 40% bodova, ukoliko brzo
uspoređujemo stringove koristeći se hashingom. Složenost rješenja je O(NQ).

Pokušajmo sada riješiti zadatak za sve bodove. Od svih riječi iz ulaza konstruirajmo
prefiks stablo. Na čvor u stablu koji odgovara prefiksu duljine p, riječi X, duljine L
zapišimo hash sufiksa duljine L - p riječi X. Nakon što smo izgradili ovu strukturu
pokušajmo vidjeti na koji upit moramo odgovoriti kako bismo saznali koliko riječi
odgovara uzorku. Neka uzorak ima dio lijevo od “*” L. Odgovor na upit je zapravo
broj hasheva koji se nalaze u podstablu prefiksa L koji su jednaku hashu desnog
dijela uzorka (dio poslije “*”). Kako brzo odgovoriti na ovo pitanje?

Napravimo li dfs obilazak prefiks stabla i označimo s D ​​t​vrijeme kada smo prvi put
posjetili čvor i s ​
F​
t​vrijeme kada smo se vratili s čvora t ​ na roditelja lako je uvidjeti

da svi čvorovi ​ x​koji se nalaze u podstablu od t​ ​imaju ​
D​ u intervalu ​
x​​ D​,​
t​ F​.
t​
Grupiramo li iste hasheve iz prefiks stabla u strukturu koja je sortirana po ​ D​
x
odgovarajućih čvorova za te hasheve možemo odgovoriti na pitanje koliko ima
hasheva ​ H​u podstablu od čvora t​ . To radimo tako da upitamo strukturu za hash ​
​ H
koliko ima ​D​x iz
​ intervala ​
D​ ,​
t​ F​. Ukoliko za strukturu koristimo map <int,
t​
vector<int>> lako podržavamo gore navedeni upit jednostavnim binarnim
pretraživanjem nad pripadajućim vectorom za neki hash. Ukoliko je S broj znakova
u ulazu, ukupna složenost rješenja je O(S lg S).

potrebno znanje: ​ dfs, prefiks stablo, rolling hash, binarno pretraživanje


kategorija: ​
strukture podataka
Zadatak PODNIZOVI Autor: Mislav Balunović

Promotrimo prvo sljedeći algoritam:

S = {} // trenutni skup podnizova 

for i in {1..K} 
    x = leksikografski najmanji podniz iz S 
    s.obrisi(x) 
    print hash(x) 
    for y in {podnizovi nastali dodavanjem jednog elementa na kraj x} 
        s.dodaj(x) 

Dakle, iteriramo po podnizovima rastuće leksikografski te nakon što obradimo


podniz dodamo sve podnizove nastale iz njega u skup za obradu.

Napravit ćemo niz ubrzanja navedenog algoritma.


Definirajmo djecu podniza kao sve podnizove nastale dodavanjem jednog člana na
kraj trenutnog podniza.

1) Primijetimo da nema potrebe dodavati više od jednog djeteta nekog podniza


u skup. Tek kad obradimo neko dijete, dodamo iduće leksikografsko dijete
podniza u skup.
2) Kada tražimo koje je iduće najmanje leksikografsko dijete nekog podniza to
možemo brzo pronaći koristeći logaritamsku strukturu ili tournament stablo.
3) Usporedbu podnizova iz skupa možemo brzo raditi ako uspoređujemo
k​
prefikse veličine 2​.

2​
Vremenska složenost algoritma je O(N lg​ N).
Za implementacijske detalje pogledajte službeno rješenje koje implementira opisani
algoritam. Alternativno rješenje koristi rekurzivnu obradu podnizova što rezultira
nešto jednostavnijim kodom.

potrebno znanje:​ tournament stablo


kategorija: ​
ad-hoc

You might also like