|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
hansu
Nieomylny Admin
Dołączył: 17 Lis 2005
Posty: 1990
Przeczytał: 0 tematów
Skąd: przychodzimy? Czym jestesmy? Dokad zmierzamy?
|
Wysłany: Pią 1:53, 01 Gru 2006 Temat postu: |
|
|
Kod tego zadania to pud i jest dostepne tylko w trybie TEST_FINDER.
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
przem
[świeżak]
Dołączył: 13 Paź 2006
Posty: 14
Przeczytał: 0 tematów
Skąd: Krosno
|
Wysłany: Pią 10:21, 01 Gru 2006 Temat postu: |
|
|
jak sie komuś chce to niech walnie tutaj jakiś tutorial typu krok po kroku bo mnie już krew zalewa z tym zadaniem, tylko bez avli plizzz
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cct
pijak
Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów
|
Wysłany: Pią 13:31, 01 Gru 2006 Temat postu: |
|
|
przem napisał: | jak sie komuś chce to niech walnie tutaj jakiś tutorial typu krok po kroku bo mnie już krew zalewa z tym zadaniem, tylko bez avli plizzz |
W kolejności malejącej sortu o którym wspominam w swoim poście odpalić procedurkę binSearch, którą również opisuje w swoim poście.
Czyli:
Kod: | for i = iloscPudelek downto 1 do
binSearchNaMapie( lewy = 1, prawy = iloscElementowMapy, szukany = pudelka[ i ].y ) ; |
Wynik to najwieksza wartosc pola "wartosc" w mapie.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
luu
[świeżak]
Dołączył: 28 Paź 2006
Posty: 10
Przeczytał: 0 tematów
|
Wysłany: Pią 13:58, 01 Gru 2006 Temat postu: |
|
|
@cct: w swoim opisie mowisz zeby wyrzucic powtorki y .
Nie wiem czy dobrze rozumiem ale przeciez ta wlasne wyrzucona moze brac udzial w budowie wiezy.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
cct
pijak
Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów
|
Wysłany: Pią 16:23, 01 Gru 2006 Temat postu: |
|
|
luu napisał: | @cct: w swoim opisie mowisz zeby wyrzucic powtorki y .
Nie wiem czy dobrze rozumiem ale przeciez ta wlasne wyrzucona moze brac udzial w budowie wiezy. |
W mapie klucze muszą być unikalne, i tam wyrzucasz powtórki Y.
Z kolei - ale to już nieobowiązkowe - możesz powyrzucać też ze swojej listy pudełek te, które mają takie same X i Y, wybierające z nich te o największej wysokości. (Warto to zrobić o tyle, że skoro i tak piszecie procedurkę do prune'owania mapy, to można jej użyć i tutaj, najlepiej odplając ją tuż po wczytaniu pudełek).
EDIT: jakby ktoś chciał, to tak wygląda procedurka binSearcha która w zasadzie załatwia to zadanko:
Kod: | BinSearch( lewy, prawy, szukany ){
if ( lewy > prawy ) return ; // dmuchamy na zimne
m = (lewy+prawy)/2 ;
// idziemy w lewo
if ( szukany < klucz[ m ] ){
maksimum = MAX{ maksimum, wartosc[ m ], max[ m ] } ;
BinSearch( lewy, m-1, szukany ) ;
}
// idziemy w prawo
else if ( szukany > klucz[ m ] ){
BinSearch( m+1, prawy, szukany ) ;
max[ m ] = MAX{ maksimum, max[ m ] } ; // poprawiamy oszacowanie prawego poddrzewa z którego wracamy
}
// siedzimy na elemencie
else {
maksimum = MAX{ maksimum, max[ m ] } + wysokoscAktualnegoElementu ;
wartosc[ m ] = MAX{ wartosc[ m ], maksimum } ;
}
} |
Oczywiście, schematycznie mocno. Za błędy i ANSy odpowiedzialności nie biorę ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
chlebek
alkoholik
Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów
Skąd: Siedlce\Kraków
|
Wysłany: Pią 20:51, 01 Gru 2006 Temat postu: |
|
|
Yoter napisał: | ... jakby ktos chciał to ja też mogę walnąć tutorial ale dla drzewek przedziałowych... |
bylbym bardzo wdzieczny, teraz trzeba walczyc o kazdy punkt
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Yoter
zielony żul
Dołączył: 19 Lis 2005
Posty: 1033
Przeczytał: 0 tematów
Skąd: Gościeradów
|
Wysłany: Sob 1:55, 02 Gru 2006 Temat postu: |
|
|
ok, no to lecimy... mam tylko nadzieję że opiszę to jakoś przyzwoicie i zrozumiale...
1. czytamy pudełka robimy trzy wersje każdego z typów pudełek(tzn. wszystkie możliwe wybory 2-elementów z 3 jako podstawki, uwaga - pierwsza krawedz podstawki ma być mniejsza od drugiej, lub na odwrót) i wrzucamy to do jakiejś tablicy - powiedzmy boxes[]
2. do innej tablicy (która potem będzie naszym drzewkiem przedziałowym) nazwijmy ją tree[], wrzucamy wartości drugich krawędzi podstawki (tych dłuższych),uwaga w tree[] mamy trzymac w każdym elemencie dwie wartości - krawedz podstawki i wysokosc wiezy którą da się postawić na tej podstawce (init na 0)
3. sortujemy boxes[] po pierwszej współrzędnej
4. sortujemy tree[] po krawedziach
5. wyrzucamy z tree[] powtarzające się krawędzie
6. tworzymy z tree[] drzewko - coś jak pełny kopiec, najlepiej zrobić to tak: znajdź najmniejszą taką potęgę 2 która jest większa od ilości krawędzi w tree[] (po wyrzuceniu powtarzających się krawędzi) i przepisz krawedzie poczynajac od indeksu rownego znalezionej potedze
7. okej teraz jak już mamy drzewko to może opiszę jak się na nim działa - jeśli zmieniamy wartosc jakiegoś liścia to po prostu przechodzimy po sciezce i uaktualniamy, oczywiście do pewnego momentu, dodam że w drzewku, w wierzchołkach nie będących liśćmi mają się znajdować maxy z potomków. jak szukamy max - sprawa będzie dość prosta w naszym przypadku bo zawsze szukamy maxa w przedziale od pierwszej krawędzi w drzewie (czyt. pierwszego liścia) do krawędzi którą chcemy uaktualnić, robimy to tak: bierzemy pierwszą krawędź i idziemy po jej ojcach tak długo dopóki poddrzewo o korzeniu w danym ojcu nie wychodzi poza przedział, bierzemy jego wartość i robimy to samo dla następnego wierzchołka z przedziału, którego już poddrzewo nie objęło, przy okazji uaktualniając naszego maxa, o ile zajdzie taka potrzeba... (całość zresztą chyba Lupus opisał wcześniej...)
8. ok mamy boxes[], mamy tree[], teraz potrzebujemy jeszcze jednej tablicy - bufora :) po co on nam to zaraz samo wyjdzie...
9. przygotowania zakończone - czas na właściwy algorytm: idziemy intem i po boxes[], wyszukujemy binsearchem drugą krawędź z boxes[i] w tree[] i teraz dwie możliwości: jeśli pierwsza krawedz z boxes[i] nie rózni się od wcześniejszych obsłużonych (tzn. boxes[i].pierwszakrawedz == boxes[i-1].pierwszakrawedz) to bierzemy maxa z przedzialu [pierwsza krawedz w tree[] (pierwszy liśc), indeks naszego elementu - 1] i jeśli (max + trzecia krawędz rozpatrywanego pudłka > aktualna wartosc pod znalezionym indeksem w tree[]) to wrzucamy do bufora indeks z tree[] który trzeba uaktualnić i wartość jaką trzeba go uaktualnić (czyli max + trzecia krawędz rozpatrywanego pudłka), druga mozliwość to boxes[i].pierwszakrawedz > boxes[i-1].pierwszakrawedz, tutaj zanim obliczymy max z przedziału robimy flush() na buforze, tzn. wszystkie elementy z bufora po kolei wpychamy do drzewa i uaktualniemy drzewko, potem już tak samo, szukamy maxa jeśli jest potrzeba to wsadzamy wynik do bufora itd.
10. po wykonaniu całej pętli robimy jeszcze raz flush() na buforze i zwracamy tree[1].wyskoscwiezy :D
i to by bylo chyba na tyle... mam nadzieję że się nigdzie nie rąbłem.... ja wiem że to jest cholernie niezrozumiale opisane, ale jeśli zaraz nie padnę to zarzucę jeszcze loga z przebiegu algorytmu dla przykladowego testu do zadania i sobie poczytacie, może zobaczycie jak to działa... jak coś będzie niejasne to pytać.
EDIT: ok przyklad jest [link widoczny dla zalogowanych]
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
trywialna
pijak
Dołączył: 12 Mar 2006
Posty: 257
Przeczytał: 0 tematów
Skąd: z kontowni:)
|
Wysłany: Sob 13:54, 02 Gru 2006 Temat postu: |
|
|
Kurcze juz nie wiem gdzie moge miec blad... na testerce mateo mam wszystko OK nawet dla duzych danych a athina mowi ANS:/ ma ktos moze jakis pomysl co moze byc zle, albo moglby ktos zerknac w moj kod? robie na drzewkach przedzialowych, bylabym wdzieczna za jakakolwiek pomoc bo juz nie mam sily do tego zadania :?
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Yoter
zielony żul
Dołączył: 19 Lis 2005
Posty: 1033
Przeczytał: 0 tematów
Skąd: Gościeradów
|
Wysłany: Sob 14:03, 02 Gru 2006 Temat postu: |
|
|
pamietaj że wynik mieści się w long longu, long longa ma też zwracać funkcja getmax() z drzewa przedziałowego, wynik najlepiej wypisuj przez cout i sprawdź czy aby na pewno dobrze budujesz drzewko... jesli dalej coś bedzie nie tak, to możesz podesłać kod, byc może będę w stanie Ci pomóc...
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
trywialna
pijak
Dołączył: 12 Mar 2006
Posty: 257
Przeczytał: 0 tematów
Skąd: z kontowni:)
|
Wysłany: Sob 18:04, 02 Gru 2006 Temat postu: |
|
|
Dziekuje wszystkim za pomoc juz przeszlo:)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
krzycho
pijak
Dołączył: 09 Lis 2005
Posty: 151
Przeczytał: 0 tematów
Skąd: Radom
|
Wysłany: Sob 20:53, 02 Gru 2006 Temat postu: |
|
|
Mam dwa pytanka do opisu:
I. Jeśli chodzi o punkt 9.
Yoter napisał: |
9.... i teraz dwie możliwości:
a)jeśli pierwsza krawedz z boxes[i] nie rózni się od wcześniejszych obsłużonych (tzn. boxes[i].pierwszakrawedz == boxes[i-1].pierwszakrawedz) to bierzemy maxa z przedzialu [pierwsza krawedz w tree[] (pierwszy liśc), indeks naszego elementu - 1] i jeśli (max + trzecia krawędz rozpatrywanego pudłka > aktualna wartosc pod znalezionym indeksem w tree[]) to wrzucamy do bufora indeks z tree[] który trzeba uaktualnić i wartość jaką trzeba go uaktualnić (czyli max + trzecia krawędz rozpatrywanego pudłka)
b) druga mozliwość to boxes[i].pierwszakrawedz > boxes[i-1].pierwszakrawedz, tutaj zanim obliczymy max z przedziału robimy flush() na buforze, tzn. wszystkie elementy z bufora po kolei wpychamy do drzewa i uaktualniemy drzewko, potem już tak samo, szukamy maxa jeśli jest potrzeba to wsadzamy wynik do bufora itd. |
Chodzi mi co się dzieje dla i = 0(mam tablice Boxes[0..MAX_BOXES]) , bo wedlug opisu mam dwa przypadki w glownej petli:
1)boxes[i].pierwszakrawedz == boxes[i-1].pierwszakrawedz
2)boxes[i].pierwszakrawedz > boxes[i-1].pierwszakrawedz
a pod Boxes[-1] .. jest pudelko raczej niezdefiniowane?
Z logow wychodzi na to ze wchodzisz do pierwszego if'a.
II. Czy trzeba szukac maximum przed pierwszym flushem? Bo wydaje mi się ze przed pierwszym flushem max bedzie zawsze = 0.
a tak BTW. to wielkie dzieki za opis:).
EDITED: przeszlo godzine przed terminem :):), A jesli chodzi o bledy to u mnie najwiecej problemow bylo z quicksortem i wypisywaniem.
Jeszcze raz wielkie dzieki za opis Yoter!!, bezproblemow wystarcza zeby przepchnac zadanie.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Yoter
zielony żul
Dołączył: 19 Lis 2005
Posty: 1033
Przeczytał: 0 tematów
Skąd: Gościeradów
|
Wysłany: Nie 2:09, 03 Gru 2006 Temat postu: |
|
|
1. dla i == 0 jakkolwiek w sumie (nawet jesli zrobimy flush() na buforze to i tak jest on pusty :))
2. zaprawdę przed pierwszym flushem maximum jest równe 0
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Ethlinn
Szatanica
Dołączył: 13 Lis 2005
Posty: 424
Przeczytał: 0 tematów
Skąd: Katowice
|
Wysłany: Nie 6:20, 03 Gru 2006 Temat postu: |
|
|
straszne zadanie... szczegolnie gdy windows zaczyna wariowac przy long longach a ja nie mam pojecia co sie dzieje... kiedy debuggujesz printfami i nagle okazuje sie, ze w zasadzie to nic sie nie liczy w twoim programie to szlag trafia... albo gdy wychodzi ze 3>0... w pewnym momencie poczulam sie jakbym byla po drugiej stronie lustra, wszystko bylo szydercze, monitor wykrzywiał się w paskudnym wrednym uśmiechu, stacja chichotała pod nosem... mozana mnie do wariatkowa zamknac :D. Na szczescie sa jeszcze informatycy, ktorzy siedza po nocach i pomagaja innym :). I chwala im za to.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
chlebek
alkoholik
Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów
Skąd: Siedlce\Kraków
|
Wysłany: Nie 12:21, 03 Gru 2006 Temat postu: |
|
|
Czy ktos moglby zobaczyc czemu juz od wczoraj meczy mnie TLE :/, bo ja juz nie moge , a kolos z MD jutro
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Gorfin
pijak
Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów
|
Wysłany: Nie 13:50, 03 Gru 2006 Temat postu: |
|
|
Mam ten sam problem. Ktorej wersji qsorta uzywacie?
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
krzycho
pijak
Dołączył: 09 Lis 2005
Posty: 151
Przeczytał: 0 tematów
Skąd: Radom
|
Wysłany: Nie 14:09, 03 Gru 2006 Temat postu: |
|
|
Tez wczoraj mialem TLE. Jesli quickSort to moze pomoc randomizacja.
U mnie tez był porblem z partitionem z Cormena, gdy lewy przedzial zaczynal sie od 0(tablice od 0..MAX_TAB-1) bo dla tablicach od 1... MAX_TAB wszystko smigalo. Znalazlem gdzies na wikipedi ladnego partitiona obslugujacego tablice zaczynajace sie od komorki 0, dodalem randomizacje i przeszlo.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
kafex
zielony żul
Dołączył: 28 Mar 2006
Posty: 1458
Przeczytał: 0 tematów
Skąd: Zawiercie
|
Wysłany: Nie 14:42, 03 Gru 2006 Temat postu: |
|
|
Partition Lomuto z randomizacją ownz :P jeszcze mnie w tym semestrze nie zawiódł :P
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Ethlinn
Szatanica
Dołączył: 13 Lis 2005
Posty: 424
Przeczytał: 0 tematów
Skąd: Katowice
|
Wysłany: Nie 14:44, 03 Gru 2006 Temat postu: |
|
|
jak wczesniej korzystałam z cormenowskiego quicksorta tak przy tym zadaniu musiałam przerzucić się na quicksorta z wykładu dr Ślusarka
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
chlebek
alkoholik
Dołączył: 04 Lut 2006
Posty: 556
Przeczytał: 0 tematów
Skąd: Siedlce\Kraków
|
Wysłany: Nie 15:16, 03 Gru 2006 Temat postu: |
|
|
alibaba napisał: | Tez wczoraj mialem TLE. Jesli quickSort to moze pomoc randomizacja.
U mnie tez był porblem z partitionem z Cormena, gdy lewy przedzial zaczynal sie od 0(tablice od 0..MAX_TAB-1) bo dla tablicach od 1... MAX_TAB wszystko smigalo. Znalazlem gdzies na wikipedi ladnego partitiona obslugujacego tablice zaczynajace sie od komorki 0, dodalem randomizacje i przeszlo. |
mialem od 0 bez randoma, wiec zminielem od 1 i z random i nad TLE ;/
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Madras
Omylny Admin
Dołączył: 09 Lis 2005
Posty: 2021
Przeczytał: 0 tematów
Skąd: Z Pokoju :]
|
Wysłany: Nie 15:28, 03 Gru 2006 Temat postu: |
|
|
Dlatego wolę heapsorta ;].
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Gorfin
pijak
Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów
|
Wysłany: Nie 22:09, 03 Gru 2006 Temat postu: |
|
|
Po dzisiejszym dniu zapamietam jedna rzecz - jak nie wiesz, jak przyspieszyc swoj program zrandomizuj qsorta ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
dzendras
Germański oprawca
Dołączył: 07 Mar 2006
Posty: 1326
Przeczytał: 0 tematów
Skąd: Chorzów
|
Wysłany: Pon 4:43, 04 Gru 2006 Temat postu: |
|
|
A ja po dzisiejszym dniu/nocy zapamiętam jedną rzecz... nie - dwie rzeczy. Po pierwsze: 2^16 != 64536, tylko 65536.
Po drugie: gdy w quicku robię sortowanie względem wielu kluczy, to nie należy zapominać o wstawianiu w partitionie wielu else.
Okaaaay? Right!
Te dwie rzeczy kosztowały mnie ładnych pare godzin. A teraz idę spać.
Ostatnio zmieniony przez dzendras dnia Pon 14:57, 04 Gru 2006, w całości zmieniany 1 raz
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
r4ku
żul
Dołączył: 09 Lut 2006
Posty: 722
Przeczytał: 0 tematów
Skąd: klikash? :D
|
Wysłany: Pon 14:21, 04 Gru 2006 Temat postu: |
|
|
ja przez 3 dni walczylem z avlami. dzis biore sie za alternatywne metody bo juz cierpliwosc do avli mi sie wyczerpala :/
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
kg86
zielony żul
Dołączył: 22 Gru 2005
Posty: 1194
Przeczytał: 0 tematów
Skąd: pochodze?
|
Wysłany: Czw 4:24, 07 Gru 2006 Temat postu: |
|
|
drzewka przedzialowe to na prawde fajna i przyjemna sprawa, jak pomysle ze mialbym zamiast tego przepisywac AVL'a to chyba bym ocipial :P a tak, cala implementacja tej struktury + jego obsluga zajela jedyne 50 linijek... :)
|
|
Powrót do góry |
|
|
|
|
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|