Informatyczny kącik olimpijski
Flagi
W tym miesiącu, chcąc polecić Czytelnikom kącika książkę Zaprzyjaźnij się z algorytmami, przedstawimy jedno zadanie z tej pozycji. Wybieramy się na wyprawę w góry.
Zadanie. Na mapie trasy zaznaczyliśmy kolejnych miejsc o wysokościach Podczas wędrówki chcemy rozmieścić jak największą liczbę flag na szczytach, czyli takich miejscach, dla których dwa sąsiednie miejsca są położone niżej (zakładamy, że pierwsze i ostatnie miejsce nie są szczytami). Jest jedno ograniczenie: jeśli rozmieszczamy flag, to odległość pomiędzy dwiema dowolnymi flagami powinna być równa co najmniej
Przykładowo dla trasy opisanej tablicą mamy dokładnie cztery szczyty (Rys. 1]).
Na tej trasie możemy rozmieścić 3 flagi (np. na szczytach 1, 5 i 10). Nie możemy jednak rozmieścić 4 flag, tak aby odległość pomiędzy nimi była równa co najmniej 4.
Wynik może być znaleziony przy użyciu wyszukiwania binarnego. Jeśli wiemy, że flag może zostać rozmieszczonych na szczytach, to również wiemy, że każda ich mniejsza liczba może też być rozmieszczona. Z drugiej strony, jeśli flag nie może zostać rozmieszczonych, to każda większa liczba flag również nie może być rozmieszczona. W ten sposób, używając wyszukiwania binarnego, redukujemy problem do sprawdzenia, czy można rozmieścić na szczytach ustaloną liczbę flag. Taki problem możemy rozwiązać już zachłannie: idziemy trasą i zawsze ustawiamy flagę na najbliższym dozwolonym szczycie. Całe rozwiązanie działa w czasie ze względu na czas wyszukiwania binarnego.
Zadanie da się rozwiązać szybciej, w czasie liniowym. Na początku, dla każdego miejsca, jeśli nie jest szczytem, znajdujemy najbliższy szczyt położony na dalszym odcinku trasy. W tym celu możemy najpierw oznaczyć wszystkie szczyty, a następnie przeglądać trasę w odwróconej kolejności, pamiętając pozycję ostatnio spotkanego szczytu. W ten sposób wypełnimy tablicę gdzie będzie najbliższym szczytem od miejsca numer na prawo (lub wartość jeżeli dalej nie występuje już żaden szczyt). Dla powyższego rysunku mamy
Zauważmy, że możemy rozmieścić co najwyżej flag. Ta obserwacja doprowadzi nas do rozwiązania optymalnego. Jeśli ustawiamy jakąś flagę na pozycji to wiemy, że następna flaga powinna być ustawiona na pozycji dalszej lub równej Takie miejsce możemy znaleźć w czasie stałym, korzystając z tablicy Pseudokod takiego rozwiązania może wyglądać następująco:
Całkowita liczba operacji nie przekroczy gdyż zarówno zewnętrzna jak i wewnętrzna pętla zostaną wykonane co najwyżej razy.