You are on page 1of 7

Zadatak NOMIS Autor: Nikola Dmitrović

Ako je zadani broj N paran, tada je sljedeći neparan broj veći od njega N + 1. Ako
je zadani broj N neparan, tada je sljedeći neparan broj veći od njega N + 2.

Rješenje (pisano u Pythonu 3.x):

N = int(input()) 
if N % 2 == 0: 
print(N + 1) 
else: 
print(N + 2) 

potrebno znanje: ​ naredba učitavanja i ispisa, naredba odlučivanja


kategorija: ​
ad-hoc

Zadatak TNT Autor: Nikola Dmitrović

Da bi saznali koliko je novca ostalo na hrpi, prvo moramo odrediti koliko je novca
prilikom dijeljenja dobio Broj 1, a koliko Alan. Očito je da je Alan dobio N kuna.
Količinu kuna za Broj 1 možemo izračunati na dva načina. Prvi je da se sjetimo
formule za zbroj prvih N prirodnih brojeva, a drugi je da naredbom ponavljanja
izračunamo spomenuti zbroj.
1.broj_1 = N * (N + 1) // 2 
2.zbroj = 0 
za i=1 do N radi: 
zbroj = zbroj + i 

Na kraju, samo još treba od ukupnog broja kuna na hrpi X oduzeti podijeljene kune
za Alena i Broj 1.

Rješenje (pisano u Pythonu 3.x):

X = int(input()) 
N = int(input()) 
hrpa = X ­ N ­ N * (N + 1) // 2 
print(hrpa) 

potrebno znanje: ​ naredba učitavanja i ispisa; naredba ponavljanja (opcija)


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

Najlakši način za riješiti ovaj zadatak je pretvoriti svaku riječ iz rječnika u niz
pritisaka tipki koju moramo pritisnuti da bismo dobili tu riječ. Dakle, pretvorimo
svaku riječ u taj niz pritisaka, npr. “ana” -> “262”.
Na kraju jednostavno izbrojimo koliko postoji “transformiranih” riječi iz ulaza
jednakih nizu pritisaka tipki provjeravajući za svaku je li jednaka s nizom pritisaka.

potrebno znanje:​ nizovi, stringovi


kategorija: ​
ad-hoc

Zadatak GEPPETTO Autor: Dominik Gleich

​N
U zadataku je potrebno prebrojati koliko kombinacija od mogućih 2​zadovoljava
uvjete kombinacije sastojaka.

Za početak možemo napraviti za svaki sastojak ​ i niz sastojaka ​


j ​koji se ne smiju
miješati s tim sastojkom. Nakon što smo ovo napravili, zadatak rješavamo
rekurzijom koja prolazi po sastojcima i pokušava napravit sljedeće:
a. Odabrati sastojak - samo ako već nismo odabrali neki sastojak koji se ne
smije miješati s trenutnim.
b. Ne odabrati sastojak.

Za detalje pogledajte službeno rješenje.


potrebno znanje: ​ nizovi
kategorija: ​ad-hoc, rekurzija
Zadatak ARTUR Autor: Ivan Paljak

Primijetimo najprije da će uvijek postojati barem jedan štapić kojeg smijemo


sukladno pravilima maknuti sa stola. Odnosno, rješenje uvijek postoji.

Prvi korak ka rješavanju zadatka jest odgovor na pitanje: “Smeta li štapić ​ B


micanju štapića ​ A​
?”. Promatramo ​ projekcije odgovarajućih dužina na x-osi.
Projekcija dužine čije krajnje točke iznose ​(x1,y1)i ​ (x2,y2)odgovara dužini čije
krajnje točke iznose ​ (x1,0) i ​ (x2,0)​ . Ako promatrane projekcije nemaju
zajedničkih točaka, tada su micanja štapića ​ A i ​ B ​međusobno neovisna. U
protivnom, označimo s ​ (​ ,0)neku od zajedničkih točaka dvaju projekcija. Neka
x’​
je ​
T​
A sjecište pravca x = ​
x’ sa štapićem ​A​
, a ​
T​B sjecište tog pravca sa štapićem ​
B​
.
Štapić ​
B smeta pri micanju štapića ​ A ako se ​T​ nalazi iznad ​
A ​ T​. Dakle, odgovor na
b​
postavljeno dobivanje dobivamo u O(1).

Zamislimo da svaka dužina odgovara čvoru u usmjernom grafu te postoji veza iz


čvora ​A u čvor ​B ​
ako i samo ako štapić ​B smeta pri micanju štapića ​A​ . Sada je
potrebno pronaći neki niz čvorova tako da za svaku usmjerenu vezu između ​ a i ​
b
vrijedi da se čvor ​
a nalazi ispred čvora ​
b u tom nizu. Ovakav poredak čvorova
zovemo ​ topološki sort​
, a pronalazimo ga blagom modifikacijom pretrage u dubinu
(DFS). Preciznije, nakon što se unutar DFS-a iz nekog čvora proširimo na sve
njegove susjede, na kraj niza dodamo taj čvor. Na taj smo način osigurali da se sve
dužine koje smetaju trenutnoj dužini maknu prije nego što mićemo trenutnu
dužinu.

Vremenska složenost algoritma iznosi O(n^2) zbog izgradnje grafa. Sam topološki
sort jednako je efikasan kao i DFS obilazak grafa. Za implementacijske detalje
pogledajte službeno rješenje.

potrebno znanje: ​ geometrija, topološki sort.


kategorija: ​
teorija grafova

Zadatak SAVEZ Autor: Zvonimir Medić

Za riješiti zadatak bilo je potrebno uočiti dvije stvari:


1. Ako je string ​ x​
i prefiks stringa ​x​, a ​
j​ x​
j prefiks stringa ​x​, tada je string ​
k​ x​i
prefiks stringa ​
x​k​(i < j < k).
2. Ako je string x  sufiks stringa y  , tada je string xR prefiks stringa yR , gdje aR
označava, string a  zapisan unazad.
Sada je dovoljno izgraditi prefiksno stablo nad podacima u malo modificiranom
obliku:
1. Abeceda nema 26 slova, nego 262 , odnosno svaki par slova predstavlja jedno
“slovo”.
2. Prilikom ubacivanja riječi u stablo, prvo slovo u paru uzimamo s početka, a
drugo s kraja
3. U svakom čvoru pamtimo najbolje rješenje za taj “prefiks” (1 +
max(djeca_čvora)).

Ukoliko krenemo od kraja ulaznih podataka zadatak smo sa širenja promijenili na


sužavanje nekog od postojećih stringova, time osiguravamo da rješenje pazi na
poredak riječi u ulazu. Rješenje je složenosti O(ukupna_duljina_riječi).

potrebno znanje: ​ prefiksno stablo, dinamičko programiranje.


kategorija: ​
ad-hoc

Zadatak VUDU Autor: Dominik Gleich

Potrebno je pronaći broj uzastopnih podniza takvih da je prosjek vrijednosti >= ​ P​ .


Za početak bitno je primijetiti da ako svakom broju oduzmemo vrijednost ​ P​ , sveli
smo zadatak na traženje broja uzastopnih podnizova takvih da im je suma
nenegativna.
Dakle, sada je zadatak u nizu brojeva pronaći broj uzastopnih podniza kojima je
zbroj vrijednosti nenegativan. To možemo radit na dva načina, ovdje ćemo objasniti
jedan, dok se u službenom rješenju nalazi drugi.
Neka pref(​x​
) bude suma prvih ​ xe​lemenata u transformiranom nizu. Lako je vidjeti
kako je suma elemenata na intervalu ​ [L​
,​
R]​= pref(​ R​) - pref(​
L - 1​
).
S obzirom da tražimo broj intervala ​ [L​ ,​
R]​možemo za svaki ​ R​računati koliko
postoji pozicija ​
L​takvih da je suma na intervalu ​ [L, R]​ nenegativna. Dakle, za
svaki pref(​
R​) pitamo se koliko postoji pref(​L - 1​) takvih da je ​L <= R ​i da je
pref(​R)​>= pref(​ L - 1)​
. Zamislimo li da se krećemo nizom s lijeva na desno, za
svaki​ R​moramo moći odgovoriti koliko ima pref(​ L-1​) <= pref(​ R), L <= R​ .
S obzirom da nas zanima samo relativni poredak između suma prefiksa možemo
napraviti sažimanje i svaku sumu prefiksa pretvorit u jedan broj iz intervala [0, N>,
ovisno o njihovom relativnom poretku. Sažimanje je potrebno napraviti kako bismo
nekom strukturom podataka mogli efikasno odgovarati na upite.
Najjednostavnija struktura za implementaciju, koja omogućava ubacivanje broja ​ X​ i
ispitavanje koliko ima manjih brojeva od nekog broja ​ Y, ​
je logaritamska struktura
(fenwick stablo), za detalje strukture pogledajte
http://wiki.xfer.hr/logaritamska_tutorial​ .
potrebno znanje: ​strukture podataka
kategorija: ​
ad-hoc, sweep

Zadatak DRŽAVA Autor: Mislav Balunović

Postoje dva konceptualno različita rješenja koja se oba baziraju na sljedećem


zaključku:

Ako postoji županija s barem ​K​gradova, premijer će biti sretan. D


​okaz ove
relativno jednostavne tvrdnje provodi se pomoću Dirichletova principa te ga
ostavljamo čitatelju za vježbu.

Prvo rješenje:

Primijetimo da možemo raditi binarno pretraživanje po udaljenosti ​ D​ ako za neki


fiksni ​
D​znamo provjeriti postoji li raspored cesta takav da premijer bude sretan.

Za svaki grad definirajmo pravokutnik (tzv.


“bounding box”) koji sadrži sve točke s manjom x
koordinatom, čija se x i y koordinate obje
razlikuju za najviše ​
D​od promatranog grada.

Dovoljno je primijetiti da ako se u tom


pravokutniku nalazi više od ​8K​ gradova, onda
postoji županija sa barem ​ K​gradova. Razlog
tome je što pravokutnik možemo podijeliti na 8 ​
manjih kvadrata s duljinom stranice D ​/2​. Svi
gradovi unutar manjeg kvadrata se nalaze u istoj
županiji te iz prije navedene leme znamo da
možemo usrećiti premijera.
Također, svi gradovi do kojih je udaljenost do
trenutnog grada manja od D ​​ nalaze se unutar
pravokutnika.
Sortirajmo gradove po x koordinati te ih obrađujmo tim redoslijedom koristeći
sweep line tehniku (​
http://wiki.xfer.hr/sweep_line/​
).

Kada obrađujemo neki grad, ubacimo ga u binarno stablo u kojem su gradovi


sortirani po y koordinati. Izbacimo iz stabla sve gradove čija se x koordinata za više
od ​
D​ razlikuje od x koordinate trenutno promatranog grada.
Sada možemo efikasno iterirati po svim gradovima unutar pravokutnika te gradove
koji su udaljeni za najviše od ​
D​od grada koji obrađujemo povezati sa njim
cestama. Ako u nekom trenutku vidimo da pravokutnik sadrži više od 8 ​K ​
točaka
možemo zaključiti da možemo usrećiti premijera i ne trebamo dalje provjeravati.

Nakon toga, radimo dfs algoritam kako bismo formirali županije te na kraju
dinamičkim programiranjem provjeravamo postoji li podskup gradova u nekoj
županiji sa sumom djeljivom s K.
​​
Vremenska složenost ovog algoritma je O(​N​
*​ K​* lg ​
D_MAX​ ) gdje je ​
D_MAX
najveća moguća vrijednost broja ​D​
.

Drugo rješenje:

Rješenje koristi činjencu da nam je za svaki grad dovoljno znati ​


K​najbližih
gradova.
(Ta činjenica direktno slijedi iz prve leme).

Rješenje se sastoji od dva dijela:


1.) Pronalaženje ​K​najbližih susjeda za svaku točku.
2.) Formiranje županija te provjera je li nastala županija koja sadrži traženi
podskup gradova.

Obrađujemo gradove s lijeva na desno te sa ​ P​označavamo najmanji ​ P​takav da


smo do sada pronašli grad s barem ​ K​ susjeda koji su udaljeni za najviše ​
P​
. Za
trenutni grad izračunajmo pravokutnik kao u prošlom rješenju te prođimo po svim
točkama u pravokutniku te pronađimo ​ K​
-tu najbližu točku iz pravokutnika te
promijenimo vrijednost ​P​
.​Primijetite da se u pravokutniku nalazi najviše 8
​ ​K
točaka sličnim argumentom kao iz prethodnog rješenja.
Ovaj dio rješenja ima složenost O (​
N​ *​K​ +​N​lg ​
N​).

Kada smo za svaki grad pronašli ​ N​ *​K​potencijalnih cesta, poredajmo te ceste po


duljini te redom povezujmo odgovarajuće dužine. Županije ćemo održavati pomoću
union find strukture podataka (​ http://wiki.xfer.hr/union_find/​). Kada povezujemo
dva grada iz različitih županija, prolazimo po svim gradovima iz manje županije te
ih ubacujemo u veću županiju te računamo koje ostatke m ​ od K ​mogu dati
podskupovi novonastale županije.
Uz pažlijvu implementaciju ovaj dio rješenja je složenosti O(​
N​*K
​​* lg ​
N)​
koristimo
li algoritam koji spaja manju na veću komponentu u union findu.

Za implementacijske detalje pogledajte službena rješenja.

potrebno znanje:​ sweep line, dinamičko programiranje, Dirichletov princip


kategorija: ​
sweep line

You might also like