Informatyczny kącik olimpijski
Dwa torty
W tym kąciku omówimy Dwa torty – kolejne zadanie z finałowej rundy Potyczek Algorytmicznych 2012.
Zadanie. Torty oferowane przez cukiernię składają się z różnych rodzajów warstw ułożonych w pewnej kolejności. Cukiernia ta zatrudnia cukierników. Każdy z nich potrafi wykonać warstwę jednego rodzaju, co zajmuje mu dokładnie jedną minutę (i w tym czasie może zajmować się tylko jednym tortem). Warstwy na każdym torcie należy układać jedna po drugiej. Chcemy wyprodukować dwa torty, dla każdego z nich znamy wymaganą kolejność warstw. Należy obliczyć, jak najszybciej da się to zrobić (Rys. 1).
Dość łatwo podać rozwiązanie tego zadania oparte na programowaniu dynamicznym i działające w czasie Niech oznaczają rodzaj -tej warstwy od dołu (dla ) odpowiednio dla pierwszego i drugiego tortu. Niech oznacza minimalny czas ułożenia dolnych warstw na pierwszym torcie i dolnych warstw na drugim torcie. Wtedy
Zależność rekurencyjna wynika z tego, że warstwy i mogą być wykonane w tym samym czasie tylko wtedy, gdy są różnego rodzaju. W przeciwnym przypadku musimy się zdecydować, którą z nich wykonujemy najpierw. Wynikiem jest
Oczywiste jest to, że wynik będzie w granicach od do Jednak Czytelnicy, którzy zechcą przeprowadzić kilka eksperymentów praktycznych, przekonają się, że znalezienie przykładu z wynikiem bliskim górnej granicy nie jest wcale łatwe. W istocie bowiem wynik nigdy nie jest większy niż To pozwala nam przyspieszyć rozwiązanie kwadratowe do gdyż musimy jedynie wypełniać przekątne tablicy leżące nie dalej niż od głównej przekątnej (tzn. możemy założyć, że dla ).
Musimy jeszcze wykazać, że zawsze istnieje strategia produkcji tortów, w której wystarczy minut. Dla uproszczenia załóżmy, że jest kwadratem liczby naturalnej. Dla ustalonego możemy zastosować następującą strategię produkcji tortów: najpierw wykonujemy pierwsze warstw pierwszego tortu, następnie par warstw (warstwę równocześnie z warstwą chyba że to wtedy po kolei), i w końcu ostatnie warstw drugiego tortu (Rys. 2). Będziemy potrzebowali minut na wszystkie warstwy pierwszego tortu, minut na ostatnie warstwy drugiego tortu oraz minut na te z pozostałych warstw drugiego tortu, które nie zostały „sparowane” z warstwami pierwszego tortu. Dla definiujemy analogiczną strategię, tylko zaczynamy od pierwszych warstw drugiego tortu.
Kluczową obserwacją jest to, że dla ustalonego rodzaju warstwy warunek jest spełniony dla dokładnie jednego Z tego wynika, że suma jest równa Sumując czas potrzebny dla wszystkich strategii dla dostajemy:
czyli średnio na strategię potrzebujemy nie więcej niż minut, zatem istnieje takie dla którego tyle wystarczy.
Dla pełności dodajmy, że wynik uzyskujemy dla tortu oraz tortu, w którym warstwy dzielimy na grupy kolejnych warstw o rozmiarach a następnie odwracamy kolejność warstw w każdej grupie. Przykładowo, dla drugim tortem jest
Powyższe rozważania stają się nieistotne, jeśli przyjrzymy się dokładniej rekurencji definiującej tablicę Zauważmy, że obliczenie w przypadku zależy tylko od jednej komórki tabeli. Zatem możemy rozwinąć wzór do gdzie jest taką najmniejszą liczbą, że i lub gdy takie nie istnieje.
Zatem obliczenie dowolnego sprowadza się do wyznaczenia wartości (co można zrobić w czasie wyszukując binarnie wśród par dla których oraz ) i obliczenia dla przypadku Zauważmy jednak, że mamy dokładnie par dla których Wyznaczając więc metodą rekurencji ze spamiętywaniem, dostajemy rozwiązanie działające w czasie Czytelnik Gorliwy zechce uzupełnić techniczne szczegóły, które przyspieszą powyższe rozwiązanie do optymalnego