Algorytmy i struktury danych, ćwiczenia, studia stacjonarne, zestaw

Transkrypt

Algorytmy i struktury danych, ćwiczenia, studia stacjonarne, zestaw
Algorytmy i struktury danych, ćwiczenia, studia stacjonarne, zestaw zadań 4, Krzysztof Ostrowski
Ćwiczenia w stosowaniu techniki zachłannej i programowania dynamicznego
Zadanie 1
Szympans zaczyna jeść banany. Zjedzenie jednego owocu zajmuje mu minutę. Wiadomo, że każdy
z bananów psuje się po pewnym czasie, a szympans chce oczywiście spożyć jak najwięcej świeżych
bananów – zepsutych nie rusza. Zaproponuj możliwie najefektywniejszy algorytm, który mając
zadane n bananów (1<=n<=1000000), z których i-ty owoc psuje się po bi minutach (1<=bi<=1000),
wyznaczy optymalną kolejność jedzenia świeżych bananów, przy której szympans najbardziej się
naje. W przypadku istnienia kilku optymalnych kolejności, algorytm może podać dowolną z nich.
Dla przykładowych danych:
1, 5, 4, 1, 3 //czasy ważności (w minutach) pięciu bananów (numeracja od 1 do 5)
Wynikiem są cztery kolejno jedzone banany o numerach:
1352
//nie jest możliwe, by szympans zjadł wszystkie 5 bananów, czemu?
Zadanie 2
Dzieci na podwórku ulepiły n kul śnieżnych (1<=n<=100000) o różnych masach. Postanowiły
wszystkie te kule skleić w jedną wielką kulę, a zadanie to powierzyły Jasiowi. Będzie on kolejno
wybierał parę kul i je zlepiał w jedną. Ten krok będzie powtarzał aż zostanie mu tylko jedna kula.
Wysiłek włożony w każde zlepienie dwóch kul jest równy sumie ich mas. Jaś ma głowę nie od
parady i nie chce się zbytnio namęczyć, więc próbuje znaleźć taką kolejność lepienia, by jego
sumaryczny wysiłek był jak najmniejszy. Pomożesz Jasiowi?
Przykładowo dla 3 kul o masach 5, 1, 3 najmniejszy możliwy wysiłek to 13 – najpierw zlepiamy
kule nr 2 i 3 (1+3=4) i nowo powstałą kulę o masie 4 dolepiamy do kuli nr 1 (4+5=9), czyli w
sumie wysiłek Jasia wynosi 13 (9+4).
Zadanie 3
Zaproponuj algorytm, który wyznacza największe możliwe wypełnienie przyczepy (o ładowności
M będącej liczbą całkowitą) n przedmiotami o pewnych całkowitych masach:
a) masy przedmiotów są potęgami dwójki
b) masy przedmiotów są dowolnymi liczbami całkowitymi
przykładowo:
dla M=10 i n=4 przedmiotów o masach 8, 1, 4, 16 optymalne wypełnienie wynosi 9 (8+1)
dla M=10 i n=5 przedmiotów o masach 5, 7, 4, 4, 2 optymalne wypełnienie wynosi 10 (4+4+2)
Zadanie 4
Mamy problem znalezienia liczby różnych rozwiązań równania x1 +x2 +...+xk = n w liczbach
całkowitych nieujemnych dla zadanych liczb n i k (0<= n <=1000, 0 < k <=1000). Przykładowo:
dla n=3 i k=2 mamy 4 rozwiązania:
3+0=3
2+1=3
0+3=3
1+2=3
dla n=5 i k=5 mamy aż 126 rozwiązań (jak nie wierzysz, wypisz ;))
Pokaż, że zachodzi tutaj własność optymalnej podstruktury wskazując dekompozycję problemu na
podproblemy (zależność rekurencyjna). Zaproponuj algorytm rozwiązania problemu.
Zadanie 5
Mamy zmodyfikowany problem z poprzedniego zadania, ale nieujemne liczby całkowite x i należą
tylko do ściśle określonego zbioru np. {2, 4}. Wówczas dla n=14 i k=5 mamy 10 rozwiązań
14=2+2+2+4+4 14=2+2+4+2+4 14=2+2+4+4+2 14=2+4+2+2+4 14=2+4+2+4+2
14=2+4+4+2+2 14=4+2+2+2+4 14=4+2+2+4+2 14=4+2+4+2+2 14=4+4+2+2+2
Jak duża część podproblemów wymaga rozwiązania dla danych przykładowych? Jak można
ulepszyć rozwiązanie?
Zadanie 6
Pewien bogacz postanowił wybrać się w Himalaje i zdobyć potężny szczyt Nanga Parbat. Na nic
zdają się perswazje jego znajomych, że to coś więcej niż wyjście do sklepu na górce. Bogacz
powiedział, że prędzej czy później wejdzie na tą górę, wystarczy, że będzie robił regularne
odpoczynki, a każdej kolejnej nocy spać będzie coraz wyżej. Jako dobrze opłacany programista
masz pomóc bogaczowi w realizacji ostatniej przygody życia. Mając daną sekwencję n
występujących kolejno po drodze bezpiecznych miejsc na biwak (a konkretnie ich wysokości npm)
należy spośród nich wybrać możliwie największą liczbę biwaków tak, by kolejne były coraz wyżej
położone. Przykład danych:
Wejście:
n=15
//liczba możliwych miejsc na biwak
0 8 4 12 2 10 6 14 1 9 5 13 3 11 7 15
//wysokości kolejnych możliwych miejsc na biwak
Wyjście:
6
//największa możliwa liczba biwaków o coraz większych wysokościach
0 2 6 9 11 15 //wysokości kolejnych biwaków
Zadanie 7
Niech będzie dany kod Fibonacciego zdefiniowany następująco:
K(0) = 0
K(1) = 1
K(n) = K(n-2)+K(n-1)
//symbol '+' oznacza konkatenacja kodów
I tak np. K(2)=01, K(3)=101 itd.
Mamy dany pewien kod binarny nazwany planszą. W pewnej grze zawodnicy na przemian
wykreślają kody Fibonacciego z prawej strony planszy. Wygrywa ten, kto skreśli z planszy ostatni
kod. Dla danej planszy sprawdź, czy zawodnik wykonujący pierwszy ruch może zawsze wygrać
(tzn. bez względu na ruchy przeciwnika istnieje dla niego strategia wygrywająca). Przykładowo dla
planszy 1101101 pierwszy zawodnik jest na pozycji wygrywającej:
Najpierw ma on opcje skreślania z tyłu planszy kodów 1 oraz 01. Wybiera tą drugą opcję i plansza
wygląda tak 11011. Przeciwnik nie ma wyboru – może tylko skreślić ostatnią 1. W rezultacie mamy
planszę 1101. W tym momencie nasz zawodnik ma 3 opcje: skreślić 1, 01 lub 101 i wybiera
skreślenie 01. Stąd plansza ma postać 11. Przeciwnik znów nie ma wyboru i skreśla ostatnią 1.
Teraz plansza ma trywialną postać 1. Nasz zawodnik ją skreśla i wygrywa.

Podobne dokumenty