Forum Informatyka UJ forum Strona Główna Informatyka UJ forum
Rocznik 2005 - czyli najlepsze forum w sieci
 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Zadanie P* - Pudełka
Idź do strony Poprzedni  1, 2, 3
 
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych
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?

PostWysł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 profil autora
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

PostWysł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 profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysł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 profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
luu
[świeżak]



Dołączył: 28 Paź 2006
Posty: 10
Przeczytał: 0 tematów


PostWysł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 profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
cct
pijak



Dołączył: 21 Mar 2006
Posty: 202
Przeczytał: 0 tematów


PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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:)

PostWysł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 profil autora
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

PostWysł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 profil autora
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:)

PostWysłany: Sob 18:04, 02 Gru 2006    Temat postu:

Dziekuje wszystkim za pomoc juz przeszlo:)
Powrót do góry
Zobacz profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Gorfin
pijak



Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów


PostWysłany: Nie 13:50, 03 Gru 2006    Temat postu:

Mam ten sam problem. Ktorej wersji qsorta uzywacie?
Powrót do góry
Zobacz profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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 :]

PostWysłany: Nie 15:28, 03 Gru 2006    Temat postu:

Dlatego wolę heapsorta ;].
Powrót do góry
Zobacz profil autora
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Gorfin
pijak



Dołączył: 06 Kwi 2006
Posty: 63
Przeczytał: 0 tematów


PostWysł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 profil autora
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

PostWysł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 profil autora
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

PostWysł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 profil autora
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?

PostWysł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
Zobacz profil autora
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Informatyka UJ forum Strona Główna -> Archiwum / 1 rok / 2 i 3 semestr - Algorytmy i Struktury Danych Wszystkie czasy w strefie EET (Europa)
Idź do strony Poprzedni  1, 2, 3
Strona 3 z 3

 
Skocz do:  
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
Regulamin