Przeskocz do treści

Delta mi!

Informatyczny kącik olimpijski

Świetliki

Tomasz Idziaszek

o artykule ...

  • Publikacja w Delcie: luty 2014
  • Publikacja elektroniczna: 30-01-2014
  • Wersja do druku [application/pdf]: (79 KB)

Tym razem w kąciku zadanie Świetliki, z którym mierzyli się finaliści Potyczek Algorytmicznych 2013.

obrazek

Czarne kropki to trzy świetliki znajdujące się w chwili math w punktach math i math poruszające się z prędkościami math i math Zaznaczono też kwadrat o minimalnym boku math w którym znajdą się świetliki w chwili math

Czarne kropki to trzy świetliki znajdujące się w chwili math w punktach math i math poruszające się z prędkościami math i math Zaznaczono też kwadrat o minimalnym boku math w którym znajdą się świetliki w chwili math

Problem. Po płaszczyźnie porusza się math świetlików. Dla każdego z owadów znamy punkt płaszczyzny, w którym znajdował się początkowo, oraz wiemy, że porusza się on ze stałym (i znanym nam) wektorem prędkości. Należy wyznaczyć minimalną długość, jaką może mieć bok kwadratu, który będzie w pewnej chwili zawierał wszystkie świetliki, przy czym boki kwadratu muszą być ustawione równolegle do osi układu współrzędnych (rysunek).

Oznaczmy jeszcze przez math  ograniczenie na zakres liczb danych w zadaniu. Zacznijmy od wykorzystania technik standardowych przy tego typu zadaniach. Bok kwadratu możemy wyznaczyć, stosując wyszukiwanie binarne, zatem math  razy będziemy musieli odpowiedzieć na pytanie „czy istnieje taka chwila math że wszystkie świetliki zmieszczą się w kwadracie o boku math”.

Kolejne standardowe spostrzeżenie: istnieje optymalne rozwiązanie, w którym skrajnie lewy świetlik znajduje się na lewym boku kwadratu. Dla ustalonego świetlika math możemy w czasie math  wyznaczyć przedział czasu, w którym znajduje się on po lewej stronie od każdego innego świetlika. Ograniczywszy się do tego przedziału czasu, unieruchamiamy tego świetlika, zaczepiając w nim układ współrzędnych (tzn. odejmujemy jego prędkość i pozycję od prędkości i pozycji wszystkich pozostałych świetlików).

Znamy bok i położenie kwadratu w poziomie, musimy teraz sprawdzić, czy istnieje taka chwila math i takie jego położenie w pionie math które zawiera wszystkie owady. Nietrudno się przekonać, że dla ustalonego świetlika zbiór punktów math dla których świetlik ten znajduje się w chwili math w kwadracie przesuniętym o  math jest równoległobokiem. A konkretnie: jeśli świetlik math znajduje się w punkcie math w chwili math a w punkcie math w chwili math to wierzchołkami szukanego równoległoboku są punkty math i  math Wyznaczenie równoległoboków dla wszystkich owadów zajmie nam czas math a następnie sprawdzenie, czy ich przecięcie jest niepuste – czas math

Ostatecznie nasze rozwiązanie działa w czasie math

Istnieje szybsze (i prostsze do zaimplementowania) rozwiązanie działające w czasie math  wymaga ono jednak pewnej nie do końca oczywistej obserwacji. Oznaczmy przez math najmniejszy bok kwadratu dla ustalonej chwili math Czy możemy coś powiedzieć o funkcji math Jasne jest, że powyżej pewnej granicy wraz ze wzrostem wartości bezwzględnej argumentu math funkcja math będzie rosnąć. Okazuje się, że możemy powiedzieć dużo więcej – funkcja math jest wypukła. Dzięki temu możemy znaleźć jej minimum, stosując wyszukiwanie ternarne, co będzie wymagało obliczenia jej wartości w  math  punktach. Dla ustalonego math obliczenie math jest bardzo proste (wyznaczamy pozycje świetlików i znajdujemy prostokąt otaczający) i wymaga czasu math Musimy tylko pamiętać, że rozwiązaniem zadania jest math jeśli minimum math znajdzie się w punkcie math

Pozostaje udowodnić kluczowy fakt o wypukłości funkcji math Oznaczmy przez math rozmiar najmniejszego kwadratu zawierającego świetliki math oraz math Ponieważ w każdej chwili wynikowy kwadrat opiera się na dwóch świetlikach po jego przeciwnych stronach, to

display-math

Funkcja math jest wypukła (łatwo to zobaczyć, jeśli znów zaczepimy układ współrzędnych w świetliku math). Tak więc funkcja math jest również wypukła, jako maksimum funkcji wypukłych.