Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Smok i owce

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: wrzesień 2014
  • Publikacja elektroniczna: 01-09-2014

Tym razem zadanie Smok z Akademickich Mistrzostw Polski w Programowaniu Zespołowym 2005, które odbyły się na Uniwersytecie Jagiellońskim.

obrazek

Jeśli mamy math pastwisk jak powyżej (liczba owiec w prostokątach), to jeden z optymalnych planów smoka jest następujący: pożera on 9 owiec z trzeciego pastwiska (płosząc 5 owiec z pierwszych dwóch pastwisk), następnie zjada 6 owiec z piątego pastwiska i w końcu 1 owcę z czwartego pastwiska.

Jeśli mamy math pastwisk jak powyżej (liczba owiec w prostokątach), to jeden z optymalnych planów smoka jest następujący: pożera on 9 owiec z trzeciego pastwiska (płosząc 5 owiec z pierwszych dwóch pastwisk), następnie zjada 6 owiec z piątego pastwiska i w końcu 1 owcę z czwartego pastwiska.

Zadanie. W długiej i głębokiej dolinie znajduje się math kolejno położonych pastwisk, na math-tym z nich pasie się math owiec. Każdego dnia dolinę może nawiedzić smok i pożreć owce z jednego pastwiska. Smok musi zawsze lecieć wzdłuż doliny (ale może wybrać, z której strony przyleci danego dnia), a z każdego pastwiska, nad którym przeleci, wszystkie owce uciekają. Ponadto pod koniec każdego dnia liczebność owiec (czy to z powodu wilków, czy pogłosek o smokach) na każdym pastwisku zmniejsza się o jeden. Należy obliczyć, ile maksymalnie owiec uda się pożreć smokowi (patrz rysunek).

Zauważmy, że niezależnie od poczynań smoka pastwiska, które nie zostały przez niego odwiedzone (tzn. owce na tych pastwiskach nie zostały przez niego ani pożarte, ani spłoszone), leżą w spójnym fragmencie doliny. To sugeruje następujące rozwiązanie dynamiczne: wypełniamy tabelkę, w której math oznacza maksymalną liczbę pożartych owiec, jeśli pastwiska nieodwiedzone leżą w przedziale math a smok wykonuje math-ty lot. Pomijając przypadki brzegowe, następująca rekurencja pozwala wyznaczyć tabelkę w czasie math :

display-math

Widać, że problemy smoka są dwa: które pastwiska wybrać i w jakiej kolejności je odwiedzać. Załóżmy, że w pewnym optymalnym rozwiązaniu smok odwiedza kolejno pastwiska o numerach math Ponieważ na każdym z nich się posili, zatem math i w sumie zje math owiec. A czy istnieje inna kolejność, w której może on odwiedzać te pastwiska? Zauważmy, że liczba owiec z pastwiska math które nie zostaną pożarte przez smoka, wynosi math zatem w sumie nie pożre on math owiec. Ale jeśli smok nie będzie latał kompletnie bez sensu (tzn. nie będzie płoszył owiec na pastwiskach math), to po math-tym przelocie liczba owiec zmniejszy się co najwyżej o math zatem w sumie zmniejszy się co najwyżej o math Zatem, odwiedzając pastwiska np. w kolejności od prawej do lewej, smok zje co najmniej math owiec, czyli tyle, ile w rozwiązaniu optymalnym.

To pozwala nam uprościć i przyspieszyć nasze rozwiązanie dynamiczne do działającego w czasie math rozważając jedynie przedziały postaci math:

display-math

Spróbujmy podejść do problemu jeszcze inaczej. Załóżmy przez chwilę, że smok swoim lotem nie straszy owiec. Może wtedy odwiedzać pastwiska w dowolnej kolejności, zatem naturalne jest, że opłaca mu się zastosować strategię zachłanną i zaczynać od pastwisk, na których owiec jest jak najwięcej. Niech math będzie ciągiem numerów pastwisk uporządkowanym nierosnąco względem liczby owiec, tzn. math Zachłanny smok pożre

display-math

owiec i będzie ucztował na pastwiskach math gdzie math jest ostatnim indeksem, dla którego math Ale, jak udowodniliśmy wcześniej, odwiedzając pastwiska ze zbioru math w kolejności od prawej do lewej, smok pożre co najmniej math owiec i nie spłoszy żadnej owcy z tego zbioru. Zatem math jest optymalną liczbą pożartych owiec, a do jej wyznaczenia wystarczy posortować dany na wejściu ciąg, co można zrobić w czasie math

Okazuje się, że powyższe zadanie można uogólnić, a rozwiązanie nadal będzie działać. Jeśli przedstawimy dolinę jako graf nieskierowany, w którym wierzchołki oznaczać będą pastwiska, a krawędzie łączyć będą te z nich, pomiędzy którymi może przelecieć smok, to dostaniemy graf o jednej ścieżce. Możemy więc zamiast niego rozważyć dowolny graf nieskierowany. To było treścią zadania Godzilla z Obozu Naukowo-Treningowego im. A. Kreczmara w 2010 roku.