Zadaci s natjecanja iz informatike: Patuljci

poruka: 16
|
čitano: 5.806
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
15 godina
neaktivan
offline
Zadaci s natjecanja iz informatike
Pijavica kaže...

Znam da baš nema veze s OOP-om..No trebam pomoć oko zadatka PATULJCI na ovom linku.=)

Dakle, prva stvar koja bi ti trebala pasti na pamet je da smrdi na koristenje dinamickog programiranja. Ono sto sam prvo pomislio je slijedece:

Krenemo od prvog patuljka, i za svakog patuljka zapisemo koliko je do njega bilo kapica koje boje. Tada kad nas zanima koliko je bilo kapica koje boje izmedu patuljaka X..Y, samo oduzmemo broj kapica, dakle X..Y = 1..Y - 1..X. Za to bi nam trebalo polje velicine NxC za pamtiti broj i boju svih kapica koje se pojavljuju od prvog do n-tog patuljka za svaki n izmedu 1 i N.

Da bismo sve to izracunali imamo slijedeci broj potrebnih operacija (sve uzima u obzir najgori moguci slucaj):

N operacija za popunjavanje polja (< 300 000 - zanemarivo)

M * (C + C) < 10 000  * 20 000 = 200 000 000 (za svaku od M slika trebamo prvo oduzetu kolicinu kapica za svaku boju, te pritom provjeriti je li za neku od tih boja imamo dovoljno kapica da se objavi slika). 200 milijuna nije za baciti, ali bi se trebalo izvrsiti ispod jedne sekunde, ako se ne vrti na nekoj prastaroj krami od kompjutera.

 

Ono sto je problem je memorija N * C moze biti cak 3 000 000 000 ~ 3GB, a mi imamo samo 32MB, pa moramo smisliti kako da tome doskocimo.

 

No, buduci da mozemo dobiti maksimalno 10 000 zadanih parova, onda niti ne trebamo tocan broj kapica od prvog do svakog od patuljaka, nego samo tih (najvise) 20 000 koji su nam bitni. Dakle, prvo pogledamo koji parovi se traze, tada za svakog od patuljaka koji nam je bitan zapisemo u tablicu za svaku boju kapica koliko ih se pojavljuje do njega (opet isto kao u prvom slucaju, samo ne zapisujemo za svakog patuljka). To nam je 20 000 * 10 000 = 200 MB, sto je nazalost jos uvijek previse.

 

E sad se tu kompliciraju stvari, i vjerojatno se ovo moze bolje, ali meni je ovako palo na pamet:

Ulazni podatke o pocetnom i zavrsnom patuljku mozemo shvatiti kao koordinate tocaka u ravnini. Udaljenost dvije takve tocke (x1, x2) i (y1, y2) definiramo kao |y1 - x1| + |y2 - x2|, zato jer ako imamo podatak koliko kapica koje boje se pojavljuje izmedu patuljaka x1 i x2, tada nam upravo toliko operacije treba da izracunamo taj podatak za ovaj drugi par (samo dodamo ili oduzmemo razliku izmedu pocetnih, x1 i y1 i krajnjih - mozemo zamisliti kao setnju). Sad uzmemo bilo koji par za pocetak, krenemo od pocetnog patuljka i prebrojimo kapice do krajnjeg. Sad od preostalih parova odaberemo najblizi po ovoj udaljenosti, i iz ovog rezultata izracunamo slijedeci, i tako anstavimo dok ne prodemo sve parove. Na samo racunanje do kjeg para idemo slijedece nam ode 50 000 000 operacija, sto nije grozno, za provjeru postoji li dobra kapica ode 100 000 000, dok za samo preracunavanje rezultata od jednog para za drugi trenutacno nemam pojma kako bih izracunao, no mislim da ne bi trebalo biti previse.

Ne znam bi li radilo za najteze test primjere, mozda je ipak presporo, ali mislim da bi

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Zadaci s natjecanja iz informatike

Kao prvo..Fala za otvaranje teme :D..Sad još da malo skontam što si napisao :P

optimizam je nedostatak informacija
Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Zadaci s natjecanja iz informatike

Ah, moje tradicionalno isvrsno objasnjavanje Osmijeh

Ak ne uspijes skuzit, slobodno pitaj da ti bolje objasnim sto ti nije jasno. A ja cu u meduvremenu jos malo razmislit kako bih to bolje rjesio. Palo mi je na pamet da mozemo naci minimalno razapinjuce stablo od tih vrhova, pa si onda siguran da nemas previse oepracija, ali je malo nezgodno sto ti za pronalazenje tog stabla treba puno memorije. Mozda bi se Primovim algoritmom moglo izvesti uz "samo" 25 MB memorije doduse, ali nekako mi smrdi da to nije smjer u kojem bi trebalo ici (ako ti nisu poznati pojmovi, potrazi na wikipediji Prim's algorithm i minimum spanning tree - u svakom slucaju korisne stvari za znati)

Moj PC  
0 0 hvala 0
15 godina
neaktivan
offline
Zadaci s natjecanja iz informatike

Skuzio sam kako se moze rijesiti lijepo Osmijeh

Naravno, rjesenje je kombinacjia ovih prethodnih dvaju rjesenja, ali kako je ovo prije sve bilo malo nespretno objasnjeno sad cu objasniti sve od pocetka, nadam se razumljivije:

 

1. Uzmemo polje integera (nazovimo ga boje[]), velicine C (broj boja, maksimalno 10 000). Sad krenemo od pocetka i za svakog patuljka kojemu je boja kapice x postavimo boje[x]++. Na taj nacin cemo nakon n koraka imati zapisano koliko se kojih kapica pojavljuje od prvog do n-tog patuljka.

 

2. Uzmemo polje integera (nazovimo ga mreza[][]), velicine C*1000 (znaci 10 000 000 integera, sto je 10 MB memorije). Nakon svakog 300-og koraka u prethodnom postupku, prepisemo vrijednosti iz polja boje u polje mreza. Znaci mreza[x][i] ce nam biti broj kapica boje x koji se pojavi izmedu prvog i i  * 300 -tog patuljka (primjer: mreza[6][3] = broj kapica boje 6 koji se pojavljuje izmedu prvog i 900-tog patuljka). Ako imamo zadano 300 000 patuljaka, morat cemo 1000 puta prepisivati 10 000 vrijednosti sto je 10 milijuna operacija (nista strasno). Iz prakticnih razloga zemo uzeti da je mreza[][0] = {0};

 

3. Sad lako izracunamo koliko ima kapica koje boje izmedu dva patuljka ciji je redni broj visekratnik broja 300 (npr kapica boje 7 izmedu 300-tog i 600-tog patuljka ima mreza[7][2] - mreza[7][1]))

 

4. Ako si redne brojeve patuljaka predocimo kao koordinate u koordinatnom sustavu, tada su parovi (pocetni, krajnji) zapravo tocke, pa vidimo da iz polja mreze mozemo relativno brzo izracunati vrijednosti boja za cijelu mrezu tocaka s koordiantama (x, y) gdje su x i y visekratnici broja 300.

 

5. Sad tu u igru dolazi ona udaljenost koju sam spominjao. Dakle, ako znamo tocan broj kapica za par patuljaka (x, y), tada iz onog pocetnog niza izracunamo broj kapica za par patuljaka (a, b) tako da oduzmemo (ako je x < a) ili dodamo (ako je a < x) sve kapice koje se pojavljuju izmedu a i x, te isto tako za b i y. (npr, ako je a > x, i prepisali smo vrijednosti kapica izmedu x i y u privremeno polje boje_tmp[], onda imamo petlju for(int i = x; i < a; i++) boje_tmp[patuljak[i]]-- ; slicno za y i b). Kad to obavimo dobili smo tocan broj kapica izmedu a i b.

 

6. Broj operacija koji nam je potreban da izvrsimo ovo u 5. jednak je 10 000 (za prepisivanje polja u privremeno polje, fiksno) + |x - a| + |y - b|. Kako nam je mreza ravnomjerno rasporedena, uvijek mozemo dobiti neki x i y koji su blizu, i to cak toliko blizu da je |x - a| + |y - b| <= 300 : Podijelimo a i b sa 300 i zaokruzimo na najblize cijele brojeve, dobit cemo trazene x i y koji su najblizi. Tada definiramo boje_tmp[i] = mreza[i][y] - mreza[i][x] za svaki i, i onda provedemo postupak iz 5.

 

U koraku 6. imali smo (ako je 10 000 fotografija) oko 100 milijuna operacija, sto bi trebalo biti dovoljno brzo + 100 milijuna (najgori slucaj, idemo po bojama dok ne naletimo na neku koje ima preko pola ili dok broj kapica koje smo vec prosli nije jednak pola - ond aznamo da nema) za nalazenje boje koje ima preko pola ako postoji.

 

Sve zajedno se radi o oko 10MB memorije i 200 milijuna operacija, sto bi trebalo biti dovoljno brzo da se izvrsi u sekundi. AKo imas pitanja, pitaj Osmijeh

Poruka je uređivana zadnji put pet 24.9.2010 10:46 (Grgapm).
Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
Zadaci s natjecanja iz informatike

OK..mislim da rauzimijem ..uoravo idem to pokušat napisat

optimizam je nedostatak informacija
Moj PC  
0 0 hvala 0
17 godina
moderator
online
RE: Zadaci s natjecanja iz informatike

Nisam siguran da sam shvatio Grgapma - niti algoritam (nisam ipak tako pazljivo citao - matrice iliti dvodimenzionalna polja su tu viska), a i kalkulacije zauzeca memorije su mu krive (10 milijuna integera zauzima 20 ili 40 megabajta, ovisno o tome jesu li short int-ovi ili obicni 32-bitni int-ovi; a charovi se ne mogu koristiti posto oni imaju maks. vrijednost 255). Ja sam doticni zadatak rijesio ovako:

1. short int * polje patuljci[], velicine N (max. 300000) - s obzirom da je short int velicine dva bajta, zauzet ce 600 kB u najgorem slucaju

indeks polja oznacava patuljka na koji se odnosi, a vrijednost boju kapice.

2. short int * polje slike[], velicine C (max. 10000), dakle u najgorem slucaju zauzima 20 kB
- polje se nakon inicijalizacije prebrise nulama
- prodje se polje patuljci od pocetka raspona do kraja raspona: slike[patuljci[x]-1]++

 

Nakon gornjih koraka u polju slike[] imamo vrijednosti koliki puta se koja boja (indeks je broj boje umanjen za jedan) pojavljuje na slici - znaci, jos samo treba jednom proci kroz polje slike[] da bi se odredila prva i druga naucestalija boja

3. Moramo pamtiti indeks najucestalije (i druge naucestalije boje) i samu ucestalost (broj patuljaka koji imaju kapicu te boje) za najucestaliju i drugu najucestaliju boju. Dakle, idemo kroz polje slike[] i ako je slike[x] > ucestalost, onda stavimo da je najucestalija boja upravo slike[x]. Ako je pak slike[x] == ucestalost, znaci da se radi o drugoj, jednako ucestaloj boji.


Na kraju samo usporedimo je li ucestalost naucestalije boje veca od ucestalosti druge naucestalije boje - ako je, onda ispises "da, " i ucestalost, ako nije, onda ispises "ne".

 

 

Prvo probaj sam rijesiti, a ako neces moci kroz nekoliko dana, onda cu poslati rjesenje.

14 godina
neaktivan
offline
RE: Zadaci s natjecanja iz informatike
mbaksa kaže...

Nisam siguran da sam shvatio Grgapma - niti algoritam (nisam ipak tako pazljivo citao - matrice iliti dvodimenzionalna polja su tu viska), a i kalkulacije zauzeca memorije su mu krive (10 milijuna integera zauzima 20 ili 40 megabajta, ovisno o tome jesu li short int-ovi ili obicni 32-bitni int-ovi; a charovi se ne mogu koristiti posto oni imaju maks. vrijednost 255). Ja sam doticni zadatak rijesio ovako:

1. short int * polje patuljci[], velicine N (max. 300000) - s obzirom da je short int velicine dva bajta, zauzet ce 600 kB u najgorem slucaju

indeks polja oznacava patuljka na koji se odnosi, a vrijednost boju kapice.

2. short int * polje slike[], velicine C (max. 10000), dakle u najgorem slucaju zauzima 20 kB
- polje se nakon inicijalizacije prebrise nulama
- prodje se polje patuljci od pocetka raspona do kraja raspona: slike[patuljci[x]-1]++

 

Nakon gornjih koraka u polju slike[] imamo vrijednosti koliki puta se koja boja (indeks je broj boje umanjen za jedan) pojavljuje na slici - znaci, jos samo treba jednom proci kroz polje slike[] da bi se odredila prva i druga naucestalija boja

3. Moramo pamtiti indeks najucestalije (i druge naucestalije boje) i samu ucestalost (broj patuljaka koji imaju kapicu te boje) za najucestaliju i drugu najucestaliju boju. Dakle, idemo kroz polje slike[] i ako je slike[x] > ucestalost, onda stavimo da je najucestalija boja upravo slike[x]. Ako je pak slike[x] == ucestalost, znaci da se radi o drugoj, jednako ucestaloj boji.


Na kraju samo usporedimo je li ucestalost naucestalije boje veca od ucestalosti druge naucestalije boje - ako je, onda ispises "da, " i ucestalost, ako nije, onda ispises "ne".

 

 

Prvo probaj sam rijesiti, a ako neces moci kroz nekoliko dana, onda cu poslati rjesenje.

 

 

Nebi li to padalo na Time limitu?

optimizam je nedostatak informacija
17 godina
moderator
online
RE: Zadaci s natjecanja iz informatike
Pijavica kaže...

Nebi li to padalo na Time limitu?

Ne znam. Ako i bi, onda ne znam gdje bi se moglo previse ustedjeti na vremenu, posto manje-vise sve te stvari moras obaviti.

 

Nego, gledam sad i vidim da je situacija zapravo jos jednostavnija nego sam mislio - nisam dobro procitao zadatak - rijesio sam zadatak kao da se trazi najucestalija boja, a ne boja koja je prisutna na > 50% slika. Modificirat cu algoritam...

15 godina
neaktivan
offline
Zadaci s natjecanja iz informatike: Patuljci

Bi, u najgorem slucaju imas preko 10 000 * 300 000 = 3 000 000 000 operacija. Radilo bi za onaj slucaj kad je broj fotografija manji od 10 (ostali su sigurno tako namjesteni da ne radi). Imas pravo za velicinu polja, ali 20MB je svejedno dovoljno malo. A moje rjesenje je samo optimizacija ovog tu - umjesto da kreces od prvog patuljka i brojis do zadnjeg, imas vec izracunato za velik broj parova, tako da uvijek mozes odabrati neki par koji je blizu i "popraviti" rezultat

Moj PC  
0 0 hvala 0
14 godina
neaktivan
offline
RE: Zadaci s natjecanja iz informatike: Patuljci
Grgapm kaže...

Bi, u najgorem slucaju imas preko 10 000 * 300 000 = 3 000 000 000 operacija. Radilo bi za onaj slucaj kad je broj fotografija manji od 10 (ostali su sigurno tako namjesteni da ne radi). Imas pravo za velicinu polja, ali 20MB je svejedno dovoljno malo. A moje rjesenje je samo optimizacija ovog tu - umjesto da kreces od prvog patuljka i brojis do zadnjeg, imas vec izracunato za velik broj parova, tako da uvijek mozes odabrati neki par koji je blizu i "popraviti" rezultat

 

Kad sam ja prvi put rješavao zadatak,na nešto slično sam ciljao..samo što sm ja napravio klasu patuljak i još par stvari.Ubiti nisam znao kod napisat :/

optimizam je nedostatak informacija
17 godina
moderator
online
RE: Zadaci s natjecanja iz informatike: Patuljci
Grgapm kaže...

Bi, u najgorem slucaju imas preko 10 000 * 300 000 = 3 000 000 000 operacija. Radilo bi za onaj slucaj kad je broj fotografija manji od 10 (ostali su sigurno tako namjesteni da ne radi). Imas pravo za velicinu polja, ali 20MB je svejedno dovoljno malo. A moje rjesenje je samo optimizacija ovog tu - umjesto da kreces od prvog patuljka i brojis do zadnjeg, imas vec izracunato za velik broj parova, tako da uvijek mozes odabrati neki par koji je blizu i "popraviti" rezultat

Da, vjerojatno bi probilo vremensko ogranicenje... S obzirom na brojeve izgleda da bi svaki brute force algoritam probio vremensko ogranicenje. Pametno su postavili brojeve - moras paziti cak i na to da koristis short int umjesto int... Osmijeh

16 godina
neaktivan
offline
Zadaci s natjecanja iz informatike: Patuljci

Da ne otvaram novu temu, spremam se za natjecanje iz informatike (teorija) polagano, pa da pitam. Pitanje glasi ovako:

Koji od sljedećih brojeva ima najviše znamenaka 0 u bazi 3 u svom zapisu?
a) 11010(2)
b) 11010(3)
c) 11010(4)
d) 11010(5)

 

I sad trebam sve osim b) svesti prvo na dekadski sustav pa onda na sustav s bazom 3? Jesam dobro shvatio? Ako da, jel ima neki laksi nacin da se rijesi ovaj zadatak?

 

I sto je to IEEE standard jednostruke preciznosti?

 

Hvala :D

:D
Poruka je uređivana zadnji put uto 18.1.2011 23:13 (Proz0r).
Moj PC  
0 0 hvala 0
16 godina
offline
RE: Zadaci s natjecanja iz informatike: Patuljci

Je, dobro si shvatio :)

 

Spremas se za Infokup? http://infokup.hr/ :D

Bravo! {#}

 

@IEEE http://web.math.hr/nastava/ppm1/ppm_fpb.pdf

 

 

DUMP udruga mladih programera
16 godina
neaktivan
offline
RE: Zadaci s natjecanja iz informatike: Patuljci

F**k yeah, na Osnove informatike :D @ Infokup

Hvala, znaci jedino pjesice mogu to. A ovaj IEEE nemam pojma kako cu naucit, jedino da si ovu subotu uzmem za to :D

:D
Poruka je uređivana zadnji put sri 19.1.2011 13:07 (Proz0r).
16 godina
offline
RE: Zadaci s natjecanja iz informatike: Patuljci

IEEE nije tezak ;)


Samo stisni malo, i savladaj to...

DUMP udruga mladih programera
16 godina
neaktivan
offline
RE: Zadaci s natjecanja iz informatike: Patuljci

Hehe probat cu, ali se sad spremam za biologiju i hrvatski, za informatiku cu kasnije jer mi je ovo iduci tjedan sve.

:D
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice