Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Dwa torty

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: wrzesień 2013
  • Publikacja elektroniczna: 31-08-2013
  • Wersja do druku [application/pdf]: (77 KB)

W tym kąciku omówimy Dwa torty – kolejne zadanie z finałowej rundy Potyczek Algorytmicznych 2012.

obrazek

Rys. 1 Dla math i tortów o warstwach math oraz math potrzebujemy czterech minut.

Rys. 1 Dla math i tortów o warstwach math oraz math potrzebujemy czterech minut.

Zadanie. Torty oferowane przez cukiernię składają się z  math różnych rodzajów warstw ułożonych w pewnej kolejności. Cukiernia ta zatrudnia math 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 math  Niech math oznaczają rodzaj math-tej warstwy od dołu (dla math) odpowiednio dla pierwszego i drugiego tortu. Niech math oznacza minimalny czas ułożenia dolnych math warstw na pierwszym torcie i dolnych math warstw na drugim torcie. Wtedy

display-math

Zależność rekurencyjna wynika z tego, że warstwy math i  math 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 math

Oczywiste jest to, że wynik będzie w granicach od math do math 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ż math To pozwala nam przyspieszyć rozwiązanie kwadratowe do math  gdyż musimy jedynie wypełniać przekątne tablicy math leżące nie dalej niż math od głównej przekątnej (tzn. możemy założyć, że math  dla math).

obrazek

Rys. 2 Przykład dla math Potrzebujemy math minut dla pierwszego tortu i dodatkowo math minut dla pozostałych warstw drugiego tortu.

Rys. 2 Przykład dla math Potrzebujemy math minut dla pierwszego tortu i dodatkowo math minut dla pozostałych warstw drugiego tortu.

Musimy jeszcze wykazać, że zawsze istnieje strategia produkcji tortów, w której wystarczy math minut. Dla uproszczenia załóżmy, że math jest kwadratem liczby naturalnej. Dla ustalonego math możemy zastosować następującą strategię produkcji tortów: najpierw wykonujemy pierwsze math warstw pierwszego tortu, następnie math par warstw (warstwę math równocześnie z warstwą math chyba że math to wtedy po kolei), i w końcu ostatnie math warstw drugiego tortu (Rys. 2). Będziemy potrzebowali math minut na wszystkie warstwy pierwszego tortu, math minut na ostatnie warstwy drugiego tortu oraz math minut na te z pozostałych warstw drugiego tortu, które nie zostały „sparowane” z warstwami pierwszego tortu. Dla math definiujemy analogiczną strategię, tylko zaczynamy od pierwszych math warstw drugiego tortu.

Kluczową obserwacją jest to, że dla ustalonego rodzaju warstwy math warunek math jest spełniony dla dokładnie jednego math Z tego wynika, że suma math jest równa math Sumując czas potrzebny dla wszystkich strategii dla math dostajemy:

pict

czyli średnio na strategię potrzebujemy nie więcej niż math minut, zatem istnieje takie math dla którego tyle wystarczy.

Dla pełności dodajmy, że wynik math uzyskujemy dla tortu math oraz tortu, w którym warstwy dzielimy na grupy kolejnych warstw o rozmiarach math a następnie odwracamy kolejność warstw w każdej grupie. Przykładowo, dla math drugim tortem jest

display-math

Powyższe rozważania stają się nieistotne, jeśli przyjrzymy się dokładniej rekurencji definiującej tablicę math Zauważmy, że obliczenie math w przypadku math zależy tylko od jednej komórki tabeli. Zatem możemy rozwinąć wzór do math gdzie math jest taką najmniejszą liczbą, że math i  math lub math gdy takie math nie istnieje.

Zatem obliczenie dowolnego math sprowadza się do wyznaczenia wartości math (co można zrobić w czasie math  wyszukując binarnie wśród par math dla których math oraz math ) i obliczenia math dla przypadku math Zauważmy jednak, że mamy dokładnie math par math dla których math Wyznaczając więc math metodą rekurencji ze spamiętywaniem, dostajemy rozwiązanie działające w czasie math  Czytelnik Gorliwy zechce uzupełnić techniczne szczegóły, które przyspieszą powyższe rozwiązanie do optymalnego math