|
Informatyka UJ forum Rocznik 2005 - czyli najlepsze forum w sieci
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
peter_89
[świeżak]
Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów
|
Wysłany: Sob 9:50, 27 Sty 2007 Temat postu: Problem algorytmiczny |
|
|
Witam,
postanowiłem poprosić Was o pomoc, jeśli dałem posta w złym miejscu to przepraszam. :wink:
Problem jest następujący:
Jest n-patyków które trzeba podzielić na k części w taki sposób by:
1) każdy patyk był równy
2) miał maksymalną możliwą długość
np. 3 patyki o długości 4, 3, 2 gdy dzielimy na 5 części to maksymalna możliwa długość wynosi 1,5.
Będę bardzo wdzięczny za każdą możliwą pomoc :D
Pozdrawiam
|
|
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: Sob 10:20, 27 Sty 2007 Temat postu: |
|
|
Nie rozumiem tego zadania...
Ale dopiero się obudziłem...
Spróbuję ponownie za godzinę.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Rogal
Zjeb z kaszanką
Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów
Skąd: koło podbiegunowe
|
Wysłany: Sob 10:43, 27 Sty 2007 Temat postu: |
|
|
Proponuję wyszukiwać tą możliwą długość binarnie.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
smas
Okrutny Admin
Dołączył: 20 Paź 2005
Posty: 1634
Przeczytał: 0 tematów
|
Wysłany: Sob 10:45, 27 Sty 2007 Temat postu: |
|
|
na pierwszy rzut oka binsearch() załatwia sprawę + sytuacje wyjątkowe, np. gdy patyka najmniejszego w ogóle nie trzeba dzielić.
|
|
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: Sob 11:15, 27 Sty 2007 Temat postu: |
|
|
Nadal nie rozumiem, ale skoro Rogal mówi binsearch, to pewnie binsearch.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Fidel
żul
Dołączył: 19 Lis 2005
Posty: 649
Przeczytał: 0 tematów
Skąd: Kraków
|
Wysłany: Sob 11:34, 27 Sty 2007 Temat postu: |
|
|
nigdy wiecej zadan z asd :P
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
smas
Okrutny Admin
Dołączył: 20 Paź 2005
Posty: 1634
Przeczytał: 0 tematów
|
Wysłany: Sob 11:51, 27 Sty 2007 Temat postu: |
|
|
Madras napisał: | Nadal nie rozumiem, ale skoro Rogal mówi binsearch, to pewnie binsearch. |
Kod: |
est n-patyków które trzeba podzielić na k części w taki sposób by:
1) każdy patyk był równy
2) miał maksymalną możliwą długość
|
n-patyków łamiemy tak, aby w tych połamanych znalazło się k równych częsci.
|
|
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: Sob 13:20, 27 Sty 2007 Temat postu: |
|
|
A no to teraz rozumiem, k równych części != każdy patyk jest równy ; ].
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Sob 14:02, 27 Sty 2007 Temat postu: |
|
|
Tak jest, binSearch między najmniejszym patykiem, a zerem ;)
edit: między min{ (suma / oczekiwana ilość) , najkrótszy_patyk }, a zerem ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
peter_89
[świeżak]
Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów
|
Wysłany: Nie 21:17, 28 Sty 2007 Temat postu: |
|
|
Skrobocik napisał: | Tak jest, binSearch między najmniejszym patykiem, a zerem ;)
edit: między min{ (suma / oczekiwana ilość) , najkrótszy_patyk }, a zerem ;) |
Hmm. dzięki ale niezupełnie o to mi chodziło. Pewnie źle sformułowałem problem :?
Napiszę to na przykładach.
1)Mamy 1 patyk o długości 10m i dzielimy na 5 części wtedy każda ma po 2m
2) 2 patyki pierwszy 10m i drugi 2m i dzielimy na 3 części to
wtedy największym możliwym kawałkiem spełniajacym założenia będzie 3,3(3)m
3) 3 patyki: 15m, 10m, 3m dzielimy na 2 części wtedy wynik=10m
Może wtedy zapomniałem dodać że nie wszystkie patyki muszą być użyte i że mogą pozostawać resztki po złamaniu. A wynik to jest największy podział spełniający założenie by patyki były równe. Tzn. z tych wszystkich trzeba wybrać tylko określone k-patyków tak by były równe i maksymalne z możliwych.
Przepraszam że traciliście czas wcześniej i BARDZO PROSZĘ O POMOC w rozwiązaniu tego problemu.
Pozdrawiam,
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Rogal
Zjeb z kaszanką
Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów
Skąd: koło podbiegunowe
|
Wysłany: Nie 21:46, 28 Sty 2007 Temat postu: |
|
|
Hmmm to może napiszę algorytm w pseudojęzyku... acz robię to tylko dlatego, że jesteś uprzejmy :wink:
Założmy, że patyki mamy dane w tablicy tab[0..n-1], gdzie n to ilość patyków. Ilość równych części które chcemy uzyskać oznaczę przez k.
Będzie potrzebna funkcja pomocnicza:
Kod: | bool isPos(double len) {
int res = 0;
for(int i=0; i<n; ++i)
res += tab[i]/len; //dzielenie całkowite, tj. 5.0/2.2=2, 10.0/3.3=3, 10.0/3.4=2
if(res>=k)
return true; else
return false;
} |
Funkcja ta dla danej długości 'len' zwraca 'true' jeśli da się podzielić wejściowe patyki na przynajmniej k równych o długości 'len'.
I teraz korzystamy z tego przy wyszukiwaniu binarnym:
Kod: | double EPS = 0.00001 //dokladnosc podanego wyniku
double p=0.0, q=2000000000.0; //q = maksymalna dlugosc patyka na wejsciu
while(p+EPS<q) {
double m=(p+q)/2.0;
if(isPos(m))
p=m; else
q=m;
}
return p; //w zmiennej p jest szukany wynik |
edited: jakby co to ostrzegam, że ten binSearch jest na czarnej liście TCS-u :D
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Nie 22:02, 28 Sty 2007 Temat postu: |
|
|
Aha, no tak, czyli jedyna zmiana, to to, że nie liczysz tego minimum, tylko od razu szukasz między (suma / oczekiwana_ilość) a zerem. Bierzesz środek z tych wartości i łamiesz wszystkie patyki, zaczynając od najdłuższych, na maksymalną ilość możliwych części o długości tego środka. Jeśli wyjdzie Ci więcej części niż jest oczekiwane, to trzeba szukać znowu w połowie między tym środkiem, co sprawdzałeś, a (suma/oczekiwana_ilość) (tutaj można spróbować dzielić patyki na większe części), a jeśli wyjdzie za mało części, to szukasz między tym środkiem a zerem (musisz dzielić na mniejsze, bo nie stracza długości z patyków, żeby podzielić). Jeśli wychodzi więcej niż trzeba, to zapamiętuj w dodatkowej zmiennej tę długość złamania i aktualizuj ją za każdym razem, jak znajdziesz lepiej pasujące złamanie.... no i tyle ;)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
peter_89
[świeżak]
Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów
|
Wysłany: Wto 18:53, 30 Sty 2007 Temat postu: |
|
|
Wielkie dzięki za pomoc. :D
Mam jeszcze jedno pytanie. Jest jakiś algorytm odpowiadający za połączenie kilku miast w taki sposób by każde było połączone (niekoniecznie bezpośrednio) by koszty podróży były jak najmniejsze. Kombinowałem coś z algorytmem Dijkstry ale nie wiem jak go przerobić do obliczania połączeń tzn. on może znaleźć np. najkrótszą drogę z A do D i nie wiem co z tym dalej.
np. w takim połączeniu:
A B C D
A 0 1 2 0
B 1 0 0 3
C 2 0 0 1
D 0 3 1 0
jest to:
A-B 1
C-D 1
A-C 2
Proszę bardzo o jakąś wskazówkę jak się za to zabrać.
PS: Rogal jesteś Wielki.
Pozdrawiam,
|
|
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: Wto 19:07, 30 Sty 2007 Temat postu: |
|
|
On to wie ; ].
A problem o który pytasz, to [link widoczny dla zalogowanych]
Zakładając, że pisząc "koszty podróży" masz na myśli sumę wszystkich użytych ścieżek.
Ostatnio zmieniony przez Madras dnia Wto 19:12, 30 Sty 2007, w całości zmieniany 6 razy
|
|
Powrót do góry |
|
|
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: Wto 19:07, 30 Sty 2007 Temat postu: |
|
|
Mozesz to jakos sprecyzowac? Co masz dane i co chcesz znalezc? Bo szczerze mowiac tak troche enigmatycznie to napisales, ciezko wywnioskowac o co konkretnie chodzi w problemie...
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
peter_89
[świeżak]
Dołączył: 27 Sty 2007
Posty: 4
Przeczytał: 0 tematów
|
Wysłany: Śro 9:23, 31 Sty 2007 Temat postu: |
|
|
Madras napisał: |
A problem o który pytasz, to minimalne drzewo rozpinające |
Właśnie o takie coś mi chodziło. Dana jest macierz sąsiedztwa i trzeba wypisać te optymalne połączenia (np. 1 - 4) wraz z kosztem (waga krawędzi). Teraz już mam zobrazowane jak to się liczy, ale nie mam zielonego pojęcia jak to zaimplementować :? Jakby ktoś wiedział gdzie można taką implementację znaleźć lub kiedyś już ten algorytm implementował to byłbym bardzo wdzięczny za pomoc.
Pozdrawiam,
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Skrobocik
[SKROBORANGA]
Dołączył: 29 Lis 2005
Posty: 2958
Przeczytał: 0 tematów
Skąd: Skarżysko , Kraków
|
Wysłany: Śro 10:26, 31 Sty 2007 Temat postu: |
|
|
Jeden ze sposobów (algorytm Kruskala):
Posortuj wszystkie krawędzie rosnąco względem długości/wagi, czy czego tam masz i zaczynasz od pierwszej - najmniejszej.Masz tutaj zbiory (tu trzeba sobie już jakoś obsłużyć te zbiory, polecam pomocniczą tablicę, w której w n-tej komórce trzymamy numer zbioru, do którego należy n-ty wierzchołek - w trakcie tworzenia może być sporo tych zbiorów, na początku = |V|, więc jakoś trzeba sobie poradzić ;) ) i zaczynasz jazdę: na początku wszystkim wierzchołkom dajesz siebie jako numer zbioru, do którego należą, czyli coś w stylu:
I teraz lecisz krawędziami w kiolejności naszego sortu, od najkrótszych i teraz są wie możliwości:
(1) krawędź łączy wierzchołki z różnych zbiorów, czyli to, o co nam chodzi, więc wybieramy większy zbiór z nich (polecam trzymać też tablicę z mocami zbiorów, bo wszystkim elementom ze zbioru trzeba zmieniać zbiór przy takim łączeniu i czasami może być to uciążliwe, znaczy czasochłonne ;) ) i zmieniamy wartości set[n] wszystkim wierzchołkom, co mają w set[n] numer tego starego zbioru, który dołączamy do większego
(2) krawędź łączy dwa wierzchłki z tego samego zbioru - pomijamy ją, bo nic nam nie zmieni
I tyle, idziesz po wszystkich krawędziach i na wyjściu będziesz miał jeden wielki zbiór punktów i krawędzi, które je złączyły (aha - trzeba oznaczać krawędzie, które łączą zbiory)
Chyba wszystko ;)
|
|
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: Śro 10:33, 31 Sty 2007 Temat postu: |
|
|
Implementowali ten algorytm chyba wszyscy z tego roku, powiedz tylko, do czego Ci to potrzebne?
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Rogal
Zjeb z kaszanką
Dołączył: 13 Mar 2006
Posty: 1745
Przeczytał: 0 tematów
Skąd: koło podbiegunowe
|
Wysłany: Śro 10:35, 31 Sty 2007 Temat postu: |
|
|
Najprościej to zrobić to taką Dijkstrą. Masz kolejkę priorytetową Q, tablicę visited[0..n-1] (n = liczba wierzchołków) inicjalizowaną na false i jakoś implementowany graf (nie wnikam jak :D )
W każdym razie pseudokod może wyglądać tak
Kod: | wrzuc do Q wszystkie krawedzie wychodzace z 0 jednoczsnie usuwajac je z grafu;
visited[0] = true;
int found = 1;
int res = 0;
while(found<n) {
sciagnij z Q krawedz o najmniejszej wadze;
int a,b = wierzcholki ktore laczy sciagnieta krawedz;
if(visited[a]==false) {
visited[a]=true;
res += waga sciagnietej krawedzi;
found++;
dodaj do Q wszystkie krawedzie wychodzace z a i usun je z grafu;
}
if(visited[b]==false) {
visited[b]=true;
res += waga sciagnietej krawedzi;
found++;
dodaj do Q wszystkie krawedzie wychodzace z b i usun je z grafu;
}
}
w zmiennej res mamy wynik |
Dużo tekstu pisanego bo nie mam pojęcia jak implementujesz graf, a zapis korzystający z STL-a jest mało czytelny jeśli ktoś tego STL-a nie zna. Widać, że algorytm to taka przerobiona Dijkstra.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Robson
zielony żul
Dołączył: 21 Paź 2005
Posty: 1274
Przeczytał: 0 tematów
Skąd: Z Lasu :]
|
Wysłany: Śro 13:04, 31 Sty 2007 Temat postu: |
|
|
moze sobie chyba pozwolic na kolejke o czasie O(n) (zwykłe szukanie liniowe) skoro ma implementacje macierzową grafu...
|
|
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
|