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

Rys. 1 Dla
i tortów o warstwach
oraz
potrzebujemy
czterech minut.
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
).

Rys. 2 Przykład dla
Potrzebujemy
minut dla pierwszego tortu i
dodatkowo
minut dla pozostałych warstw drugiego tortu.
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