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.