Professional Documents
Culture Documents
INFORMATIKE 2013/2014
3. KOLO
OPISI ALGORITAMA
HONI 2013/2014 Zadatak ZDRAVKO
3. kolo, 7. prosinca 2013. Autor: Marin Tomić
Najmanji broj tužbi koje Zdravko može podići protiv nas, a da ih bude više
od N jest N+1. Ako izgubimo N+1 tužbu moramo platiti C*(N+1) kunu.
znamenka_jedinica = B mod 10
znamenka_desetica = (B div 10) mod 10
znamenka_stotica = (B div 100) mod 10
Kategorija: ad hoc
Kategorija: ad hoc
Pseudokod:
imenuj(x)
odgovor = ‘’
ako je znamenka stotica od x različita od 0:
odgovor = odgovor + stotice[znamenka stotica od x]
izbaci znamenku stotica iz x
ako je x između 1 i 19:
odgovor + odgovor + posebni[x]
inače:
ako je znamenka desetica od x različita od 0:
odgovor = odgovor + desetice[znamenka desetica od x]
ako je znamenka jedinica od x različita od 0:
odgovor = odgovor + jedinice[znamenka jedinica od x]
Kategorija: ad hoc
Npr. par (32, 1689) bi bio izgrađen dodavanjem redom znamenki (0, 1), (0,
6), (3, 8), (2, 9).
Ovo rješenje nije ništa brže od rješenja koje koristi dvije petlje, no može
se popraviti. Prvo ćemo se riješiti parametra suma iz funkcije.
num(prefiks1, prefiks2):
ako su prefiksi izgrađeni do kraja, vrati 1
rj = 0
neka (x, y) prolazi po svim mogućim parovima znamenki:
ako možeš dodati x na prefiks1 i y na prefiks2:
rj = rj + num(prefiks1 * 10 + x, prefiks2 * 10 + y)
vrati rj
f(prefiks1, prefiks2):
ako su prefiksi izgrađeni do kraja, vrati 0
rj = 0
neka (x, y) prolazi po svim mogućim parovima znamenki:
ako možeš dodati x na prefiks1 i y na prefiks2:
rj = rj + num(prefiks1 * 10 + x, prefiks2 * 10 + y) * |x – y|
rj = rj + f(prefiks1 * 10 + x, prefiks2 * 10 + y)
vrati rj
Promatrajmo dio grada između neke dvije zgrade, taj interval označimo sa
[X, Y]. Za početak zanemarimo odašiljače desno od tog intervala. Svaki
odašiljač pokrit će neki dio [Z, Y], dok će lijevi dio [X, Z] biti nepokriven.
Dovoljno je, dakle, naći odašiljač koji ima najmanji Z, nazovimo ga ZL.
Proći ćemo kroz sve zgrade s lijeva na desno. Pritom ćemo održavati
strukturu u kojoj će se nalaziti neki od odašiljača sa zgrada koje smo već
prošli. Odašiljači će u strukturi biti poredani rastuće po svojoj apscisi. U
strukturi svakom će odašiljaču biti pridružena točka na X osi koja
označava mjesto od kojeg počinje pokrivenost tim odašiljačem ako se
uzmu u obzir zgrade koje smo do sada prošli (pokrivenost se prostire od te
točke na desno).
Sada ćemo pokazati bitno svojstvo strukture. Za odašiljač O označimo s
XO njegovu apscisu, s HO visinu, a s TO njegovu pridruženu točku, točnije
apscisu te točke. Definirajmo uz to i predikat bolji. Za dva odašiljača A i B
kažemo da je A bolji od B ako je TA < TB. Pretpostavimo sada da se u
strukturi nalaze dva odašiljača: A i B, za koje vrijedi XA < XB. Ako vrijedi
HA <= HB odašiljač B možemo izbaciti jer je A bolji. Pretpostavimo, dakle,
dodatno da vrijedi HA > HB. Ako vrijedi TA < TB, odašiljač B možemo
izbaciti, jer će A uvijek biti bolji.
Kada prođemo kroz sve zgrade s lijeva na desno vrlo sličan postupak
ponovimo i sa suprotne strane te time dobivamo nizove ZL i ZD iz kojih
znamo konstruirati rješenje.
U rješenju ovog zadatka prolazimo dva puta kroz sve zgrade održavajući
strukturu koja može biti implementirana kao stog. Svaki korak prolaska
kroz zgrade amortizirane je konstatne složenosti jer kada prođemo kroz
sve zgrade svaki ćemo odašiljač točno jednom ubaciti i izbaciti iz
strukture. Budući da su operacije na stukturi koje koristimo konstatne
složenosti, složenost cjelokupnog rješenja je linearna tj. O(n), gdje je n
broj zgrada.