Professional Documents
Culture Documents
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.
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
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.
potrebno znanje:
Baratanje s osnovnim aritmetičkim operacijama, naredba
odlučivanja
kategorija:
ad-hoc
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).
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
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 Kbrojeva
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:
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 tvrijeme kada smo prvi put
posjetili čvor i s
F
tvrijeme kada smo se vratili s čvora t na roditelja lako je uvidjeti
da svi čvorovi xkoji 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 Hu podstablu od čvora t . To radimo tako da upitamo strukturu za hash
H
koliko ima Dx 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).
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)
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.