Na linii liczbowej długości M
, gdzie 0 < M <= 1,000,000,000
podałeś N
( 1 < N <= 100,000
) liczby całkowite par punktów. W każdej parze pierwszy punkt reprezentuje miejsce, w którym aktualnie znajduje się obiekt, a drugi punkt reprezentuje miejsce, w którym należy przenieść obiekt. (Pamiętaj, że second
punkt może być mniejszy niż first
).
Załóżmy, że zaczynasz od punktu 0
i masz wózek, który może pomieścić 1
przedmiot. Chcesz przenieść wszystkie obiekty z ich początkowych pozycji do odpowiednich końcowych pozycji podczas podróży najmniejszą odległości wzdłuż linii liczbowej ( nie przesunięcia). Musisz skończyć na punkcie M
.
Teraz staram się zredukować ten problem do prostszego. Szczerze mówiąc, nie mogę nawet wymyślić rozwiązania brutalnej siły ( być może zachłannego). Jednak moją pierwszą myślą było zdegenerowanie ruchu wstecz do dwóch ruchów do przodu, ale nie wydaje się to działać we wszystkich przypadkach.
Narysowałem tutaj 3
przykładowe przypadki testowe:
Odpowiedź na pierwsze testcase jest 12
. Najpierw podnosisz red
przedmiot w punkcie 0
. Następnie przejdź do punktu 6
(odległość = 6
), red
tymczasowo upuść element, a następnie podnieś green
element. Następnie przejdź do punktu 5
(odległość = 1
) i upuść green
element. Następnie wróć do punktu 6
(odległość = 1
) i podnieś red
upuszczony przedmiot, przejdź do punktu 9 (odległość = 3
), a następnie przejdź do punktu 10
(odległość = 1
), aby zakończyć sekwencję.
Całkowity przebyty dystans wynosił 6 + 1 + 1 + 3 + 1 = 12
minimalną możliwą odległość.
12
Wierzę, że pozostałe dwa przypadki mają odpowiedzi . Nie mogę jednak znaleźć ogólnej zasady, aby ją rozwiązać.
Czy ktoś ma jakieś pomysły?
źródło
Odpowiedzi:
Jeśli jesteś pusty, zacznij przesuwać się w prawo.
Ilekroć dotrzesz do obiektu i będziesz pusty, podnieś go (duh) i idź w kierunku jego celu.
Ilekroć dotrzesz do przedmiotu,
a
który już nosiszb
, zawsze wybieraj którykolwiek z obiektów ma najmniejszy numerycznie cel (najdalej w lewo).Jeśli nie jesteś jeszcze w M, wróć do kroku 1.
Jest to optymalne: Jedynym miejscem, w którym masz prawdziwy wybór, jest krok 3. Najpierw obsłużenie najbardziej wysuniętego na lewo miejsca docelowego gwarantuje, że do czasu wysłania obu obiektów znajdziesz się jak najdalej po prawej stronie.
Dlaczego to pytanie dotyczy programmers.sx? Tak, „pytanie do wywiadu”, ale to tylko fajna zagadka.
PS. Jeśli chodzi o implementację, wystarczy lista zadań (całkowite pary punktów) posortowane według oryginalnej pozycji.
źródło
Załóżmy, że otrzymujesz te ruchy,
(a, b), (c, d), (e, f), ...
to minimalna odległość do przebycia toabs(b - a) + abs(d - c) + abs(f - e) + ...
faktyczna odległość, którą podróżujeszabs(b - a) + abs(c - b) + abs(d - c) + abs(e - d) + ...
.Zasadniczo, biorąc pod uwagę tablicę ruchów, celem jest zminimalizowanie funkcji „odległości podróży” poprzez zamianę elementów. Jeśli weźmiesz pod uwagę konkretną kombinację jako węzeł, a wszystkie kombinacje, które możesz z niej wyciągnąć jako krawędzie, możesz użyć jednego z wielu algorytmów wyszukiwania grafów, wokół których wykorzystuje się heurystykę. Jednym z przykładów jest wyszukiwanie wiązki .
źródło
Być może nie rozumiem problemu, ale co z następującymi kwestiami:
Fakt, że jest posortowany, gwarantuje, że nie będziesz chodził tam i z powrotem po elementach, aby umieścić je w odpowiednim miejscu (niezależnie od tego, czy linia jest reprezentowana jako tablica czy lista)
Zaktualizuj po komentarzu @templatetypedef:
Użyj a,
HashTable
aby zapisać wszystkie pary. Użyj bieżącej lokalizacji każdej pary jako klucza indeksu.Użyj drugiego indeksu nad parami.
źródło
Moja skłonność do algorytmu, który jest w zasadzie chciwy:
Zbuduj listę punktów, które należy przenieść. Ponieważ optymalizacja tego nie jest częścią wymaganego problemu, nie będę się martwić o jego zorganizowanie.
Myślę, że dotyczy to wszystkich przypadków. W pewnym sensie jest rekurencyjny, ale poprzez aktualizację listy zamiast wywoływania siebie.
źródło
Destination = SubList.FindSmallest(Location, Move.Origin)
? CoMove.Origin
reprezentuje?Jest to asymetryczny problem sprzedawcy podróżującego . Możesz myśleć o tym jak o wykresie. Krawędzie będą każdą parą (początek, koniec), jedną dla każdej (0, początek) i wszystkimi innymi parami (koniec, początek).
Zakładając, że NP! = P, będzie miał wykładniczy oczekiwany czas działania.
źródło
M
jest punkt końcowy linii liczbowej?N
może wynosić 100 000.