Zgodnie z sugestią @randomA, przejdziemy do dwóch etapów: Najpierw znajdziemy zestaw lasek, które zostaną wycięte, a następnie zminimalizujemy liczbę cięć.
Podobnie jak w przypadku szczególnym w pytaniu, sortujemy / nazywamy patyki tak, aby . Zajmuje to czas . O ( n log n )L1≥L2≥⋯≥LnO(nlogn)
@ User1990169 jak podkreślił, nie musimy wyciąć kawałek .i≥k
W pierwszej fazie wykorzystujemy wyszukiwanie binarne w celu znalezienia liczby , , aby kije można było pociąć na co najmniej kawałków o rozmiarze (plus kilka mniejszych) , ale drążków nie można pokroić na kawałków o rozmiarze . Zajmie to czas .1 ≤ s ≤ k 1 , … , s k L s 1 , … , s - 1 k L s - 1 O ( k log k )s1≤s≤k1,…,skLs1,…,s−1kLs−1O(klogk)
Jeśli , ta wartość jest optymalnym rozmiarem i możemy pominąć fazę drugą.Ls−1=Ls
W przeciwnym razie wiemy, że optymalna wielkość spełnia a jeśli następnie wynikach cięcia co najmniej jeden z patyczków na równe wielkości kawałki. Faza druga określi :oLs−1>o≥Lso>Lsoo
Dla każdego kija , określ zestaw rozmiarów kandydatów w następujący sposób: Jeśli cięcie na kawałki o rozmiarze zamienia kij na kawałki (w tym krótszy, jeśli taki istnieje), kandydaci na to stick to wszystkie wartości , gdzie i . (Zobacz odpowiedź @ user1990169, aby dowiedzieć się, dlaczego są to jedyne rozmiary kandydatów).i1≤i≤sLsriLijj≤riLij<Ls−1
Zachowaj dla każdego rozmiaru kandydata, jak często to miało miejsce. Korzystając ze zrównoważonego drzewa wyszukiwania, można to zrobić w , ponieważ całkowita liczba kandydatów jest ograniczona przez .O(klogk)∑iri≤2k
Teraz najczęściej wybierany rozmiar, który prowadzi do prawidłowego cięcia, to taki, który zapewnia nam optymalne rozwiązanie. Ponadto, jeśli jakikolwiek rozmiar kandydujący prowadzi do prawidłowego cięcia, każdy mniejszy rozmiar doprowadzi również do prawidłowego cięcia.
Możemy więc ponownie zastosować wyszukiwanie binarne, aby znaleźć największą długość kandydata, która prowadzi do prawidłowego cięcia w . Następnie iterujemy zestaw długości kandydatów do tego progu i znajdujemy tę o największej liczbie spośród nich w .O(klogk)O(k)
W sumie otrzymujemy środowisko wykonawcze w lub , jeśli zignorujemy (lub nie będziemy musieli) sortować początkowe.O(nlogn)O(klogk)