You are on page 1of 10

HRVATSKO OTVORENO NATJECANJE IZ

INFORMATIKE

7. KOLO

RJEŠENJA
HONI 2009/2010 Zadatak: SPAVANAC
7. kolo, 24. travnja 2010. Autor: Marko Ivanković
Potrebno je samo pažljivo implementirati operaciju "45 minuta prije". Valja
paziti na vremenske raspone s M manje od 45, te posebno na vrijeme od 0:00
do 0:45.

Potrebno znanje:
ucitavanje brojeva, matematicke operacije

Kategorija:
ad-hoc
HONI 2009/2010 Zadatak COKOLADA
7. kolo, 24. travnja 2010. Autor: Leo Osvald
Da bi uopće mogli dobiti dovoljan broj kvadratića čokolade, moramo imati
dovoljno dugačku čokoladu, pa ćemo uzeti najmanje pakiranje koje sadrži
barem K kvadratića tj. najmanju potenciju broja 2 veću ili jednaku K. Uočimo
da sada radi pohlepna strategija. Ako imamo komad čokoladu duljine N i
trebamo dobiti komad čokolode duljine L u najmanje lomljenja, to ćemo dobiti
tako da čokoladu lomimo po pola dok god ne dobijemo duljinu koja je manja
ili jednaka L. U tom trenutku imat ćemo sve komade čija je duljina neka
potencija broja 2 između između L i N-1 (uključivo) i to točno dvaput. Sad
ostaje problem da dobijemo točno N-L kvadratića čokolade. Primijetimo da
lomljenjem čokolade po pola na ovaj način nismo ništa izgubili jer nam uvijek
ostaje ona druga polovica koju onda možemo prelamati kako bi popunili
ostatak (N-L), a komad duljine L ionako moramo dobiti ako na kraju imati
točno K (a ne više) kvadratića čokolade. Kad imamo komad duljine L, situacija
je analogna početnoj, znači ponavljajući ovaj postupak doći ćemo slučaja
kada trebamo dobiti još 0 kvadratića, kada smo gotovi.
Također, primijetimo da nikada nećemo lomiti dva komada iste duljine.
Primjenjujući gore opisan algoritam, matematičkom indukcijom zaključujemo
da ćemo mi u biti lomiti komade čije su duljine uzastopne potencije broja 2,
počevši od N. (*)
Stoga, prelamanja možemo predstaviti binarnim brojem koji sadrži jedinicu
i
na bitu i ako i samo ako smo lomili komad duljine 2 . Ako broj K zapišemo
binarno, ispada da će najmanji komad čokolade koji lomimo imati duljinu koja
je jednaka težina najdesnijeg bita. Zbog (*), minimalni broj lomljenja biti
jednak razlici pozicija najlijevijeg i najdesnijeg bita u binarnoj reprezentaciji
broja K.

Potrebno znanje:
Binarni brojevi, pojam potencije

Kategorija:
pohlepni algoritmi
HONI 2009/2010 Zadatak BAKICE
7. kolo, 24. travnja 2010. Autor: Marko Ivanković
Za početak, izračunajmo za svaku bakicu koliko je udaljena od svih sjedala.
Tada opetovano izvodimo sljedeće, pronalazimo u cijelom prometalu bakicu
najbližu nekom sjedalu. Za nju provjeravamo dolazi li do eksplozije, te ako
dolazi s kojim još bakicama. Tada tu bakicu, i sve eksplodirale, brišemo s
tlocrta zajedno s stolcem. Postupak ponavljamo dok ima bakica i stolaca.

Potrebno znanje:
izračun najkraćeg puta

Kategorija:
najkraći put, pohlepni algoritmi
HONI 2009/2010 Zadatak SVEMIR
7. kolo, 24. travnja 2010. Autor: Goran Žužić
Potrebno je da se, prije rješavanja ovog zadatka, upoznate sa problemom
"Minimum spanning tree" i barem jednim načinom rješavanja, na primjer:

• http://en.wikipedia.org/wiki/Kruskal%27s_algorithm

Sada zamislimo 3 niza planeta: u prvom nizu su planete sortirane po x-


koordinati, u 2. po y i u zadnjem po z-koordinati. Tvrdim da će postojati
optimalno rješenje u kojem niti jedan tunel neće spajati dva planeta koji nisu
susjedni barem u jednom od ta tri niza. U to se lako uvjeriti:

Pretpostavimo da dvije planete (A i B) ovisi o njihovoj x-koordinati, tj. |xA-xB|


≤ min{|yA-yB|, |zA-zB|} te pretpostavimo da oni u tom nizu nisu susjedne,
tj. da xA ≤ xC ≤ xB. Sada je jasno da umjesto tunela (A,B) možemo izgraditi
dva tunela: (A,C) i (C,B) po cijeni koja nije veća od gradnje tunela (A,B) zbog
toga jer dist(A,C) + dist(C,B) ≤ |xA-xC| + |xC-xB| = |xA-xB|.

Sada smo skoro gotovi. Izgradimo graf u kojem veza između dvije planete
postoji ako su susjedni u nekom od nizova te samo pustimo Kruskalov
algoritam da riješi taj graf sa 3N-3 brida u nekoj razumnoj složenosti.

Potrebno znanje:
Kruskalov / Primov algoritam, Minimum spanning tree

Kategorija:
teorija grafova, ad-hoc
HONI 2009/2010 Zadatak KRALJEVI
7. kolo, 24. travnja 2010. Autor: Leo Osvald
Za početak, primijetimo da jednostavnim pamćenjem koordinata svih
kraljeva na ploči, te računanjem udaljenosti svih parova kraljeva oba igrača
2
dolazimo do algoritma složenosti O(N ) koji donosi 30% bodova na ovom
zadatku.

Algoritam složenosti O(N*D + R*S), gdje je D = max{R, S} na ovom


zadatku pokupit će 60% bodova. Ideja je da prvo izračunamo tablicu iz koje
ćemo moći efikasno provjeriti koliko figura se nalazi na poljima koja su
udaljena za točno K. Pošto takva polja čine kvadrat (u slučaju ploče
beskonačnih dimenzija), a kvadrat pak čine uzastopni članovi određenih
redaka odnosno stupaca, uz pomoć dinamičnog programiranja možemo
odgovoriti na ovo pitanje u vremenskoj složenosti O(1), pod uvjetom da smo
prethodno izračunali tablicu u složenosti O(R*S).
Sad redom za svako polje na kojem se nalazi figura pitamo koliko se figura
nalazi na udaljenosti d, za sve moguće udaljenosti d, te svaki puta rješenju
umnožak tog broja sa udaljenosti d. Na kraju valja rješenje podijeliti sa 2,
pošto smo svaku udaljenost računali dvaput.

Zadatak je za sve bodove moguće rješiti na nekoliko različitih načina, a mi


ćemo ovdje razmitriti jedan od najjednostavnijih, čija je vremenska
složenost O(R*S). Sumu udaljenost svih parova kraljeva pojedinog igrača
naći ćemo u dva koraka istog algoritma; prvi puta ćemo naći sumu
udaljenosti između svaka dva kralja za čije pozicije vrijedi X1 ≤ X2 i Y1≤ Y2,
a drugi puta sumu udaljenost između svaka dva kralja za čije pozicije vrijedi
X1 > X2 i Y 1 < Y 2 .
Da bi našli prvo spomenutu sumu krenut ćemo iz kuta ploče s koordinatama
(X, Y) = (0, 0), te ćemo polja obilaziti tako da idemo red po red odozdo
prema gore, a polja unutar retka obilazimo slijeva nadesno. Pretpostavimo
da indeksi redova rastu idući prema gore, a indeksi stupca padaju idući
slijeva nadesno. Pamtit ćemo sljedeće podatke:
- red_suma(X, Y) - broj figura koje se nalazi u istom redu lijevo od
trenutnog polja (tj. Xi < X, Y = Yi), te sumu udaljenosti od trenutnog polja
do polja na kojima se nalaze te figure - red_broj(X, Y)
- stup_suma(X, Y) - broj figura koje se nalaze u istom stupcu ispod
trenutnog polja (tj. Xi = X, Yi < Y), te sumu udaljenosti od trenutnog polja
do polja na kojima se nalaze te figure - stup_broj(X, Y)
- dp_suma(X, Y) - broj figura koje se nalaze u području ploče lijevo i ispod
trenutnog polja tj. za čije pozicije vrijedi Xi ≤ X i Yi ≤ Y, te sumu udaljenosti
od trenutnog polja do polja na kojima se nalaze te figure - dp_broj(X, Y)

Za računanje tih šest podataka koristimo tehniku dinamičkog programiranja.


red_suma(X, Y) = red_suma(X, Y-1) + red_broj(X, Y-1)
red_broj(X, Y) = red_broj(X, Y-1) + B(X, Y)
stup_suma(X, Y) = stup_suma(X-1, Y) + stup_broj(X-1, Y)
stup_broj(X, Y) = stup_broj(X-1, Y) + B(X, Y)
dp_suma(X, Y) = dp_suma(X-1, Y-1) + dp_broj(X-1, Y-1)
+ red_suma(X, Y) + stup_suma(X, Y) + B(X, Y)
dp_broj(X, Y) = dp_broj(X-1, Y-1) + red_broj(X, Y)
+ stup_broj(X, Y) + B(X, Y)
Pri čemu je B(X, Y) jedan ako se na polju (X, Y) nalazi figura igrača čiju
raspršenost figura računamo, a nula inače.
Sad kad znamo kako izračunati te podatke, pogledajmo čemu je jednaka
suma udaljenosti polja (X, Y) od ostalih figura. Pošto se te figure mogu
nalaziti ili u istom retku/stupcu, ili pak u donjem lijevom području, suma je
jednaka:
suma(X, Y) = dp_suma(X-1, Y-1) + red_suma(X, Y) + stup_suma(X,
Y),
Na ovaj način možemo dobiti svaki puta kada smo na polju na kojem se
nalazi figura pribrojiti trenutnom rješenju tu sumu, pa ćemo tako dobiti
ukupnu sumu svih parova za čije pozicije vrijedi X1 ≤ X2 i Y1≤ Y2.
Za slučaj pozicija parova kraljeva za koje vrijedi X1 > X2 i Y1 < Y2, okrenut
ćemo stupce u svakom redu pa će za pozicije vrijediti X1 < X2 i Y1 < Y2, što
rješavamo na način sličan gore opisanom, sa razlikom da je suma
udaljenosti do nekog polja jednaka:
suma(X, Y) = dp_suma(X-1, Y-1)
zato jer ne smijemo ponovno razmatrati slučajeve kad su figure u istom retku ili stupcu.
Potrebno znanje:
Dinamičko programiranje

Kategorija:
Dinamičko programiranje
HONI 2009/2010 Zadatak RESTORAN
7. kolo, 24. travnja 2010. Autor: Goran Žužić
Definirajmo stupanj grada kao broj cesta koje završavaju u tom gradu. Dalje,
stvorimo dodatni grad X i spojimo ga na sve gradove koji imaju neparni
stupanj. Sada je jasno da će svaki grad biti parnog stupnja (uključujući i X).
Zbog tog svojstva, sada u svakoj komponenti grafa postoji ciklus koji prolazi
kroz sve bridove i vraća se u početni vrh. Nađemo za svaku komponentu
posebno taj ciklus i alternativno na parnim i neparnim bridovima dajemo
pravo gradnje kompaniji 1 odnosno 2. Više informacija o traženju tog ciklusa
moguće je naći na http://en.wikipedia.org/wiki/Eulerian_path .

Primjetimo sada da smo uspješno riješili sve komponente početnog grafa


koje su imale barem jedan neparni stupanj. Jedinu dvojbu imamo oko
komponenata koje su i prije imale sve parne stupnjeve (u njima i od prije
postoji ciklus koji prolazi kroz sve bridove). Sada imamo nekoliko slučajeva:

• Ukoliko komponenta sa svim parnim stupnjevima ima neki vrh sa


stupnjem većim ili jednakim 4, počinjemo tražiti ciklus od nje i sigurno
ćemo dobiti točno rješenje
• Inače, svi su stupnjevi u komponenti jednaki 2. Drugim riječima, ta
komponenta je jednostavni ciklus. Sada znamo da parni ciklus možemo
jednostavno rješiti, dok je neparni (očito) nemoguć.

Test podaci:

Grupirani su u 6 grupa. Prve 4 grupe su jednostavni slučajni grafovi malih


veličina i ukupno nose 20% bodova za zadatak (dakle, 5% po grupi).

Preostale dvije grupe nose svaka po 40% bodova i jedina razlika među njima
je u broju gradova. Ovo je opis pojedinih test podataka veće od dvaju grupa:

• a) veliki neparni ciklus (rješenje je 0)


• b) stablo
• c) lanac
• d) ciklus neparne duljine sa nekoliko gradova spojenih na ciklus
• e) 99 ciklusa duljine 1001 povezanih u lanac + nekoliko izoliranih
gradova
• f) 10 ciklusa duljine 9999 povezanih u lanac + jedan izoliran grad
• g) slučajni graf u više komponenata
• h) slučajni graf sa ograničenjem da stupanj svakog grada ne
premašuje 3

Potrebno znanje:
Eulerov ciklus (postoji i rješenje bez njega!)

Kategorija:
teorija grafova, ad-hoc

You might also like