@randomA가 제안한 바와 같이, 우리는 두 단계로 진행할 것입니다. 먼저 절단 할 스틱 세트를 찾은 다음 절단 수를 최소화합니다.
문제의 특별한 경우와 마찬가지로 스틱을 정렬 / 이름 지정하여 합니다. 이것은 O ( n log n ) 시간 이 걸립니다 .엘1L 이상2≥ ⋯ ≥ L엔O ( n 로그n )
@ user1990169가 지적했듯이, 우리는 조각을자를 필요가 없습니다 .나는 ≥ k
첫 번째 단계에서는 번호 찾기 위해 이진 검색을 사용하는 , 1 ≤ S ≤ K 때문에 스틱 것을 1 , ... , S는 로 될 수 컷 적어도 K의 크기의 조각 L S (및 약간의 작은 조각들)이지만 스틱 1 , … , s - 1 은 크기 L s - 1 의 k 조각 으로 절단 할 수 없습니다 . 이것은 O ( k log k ) 시간이 걸립니다.에스1 ≤ s ≤ k1 , ... , S케이엘에스1 , … , s − 1케이엘s − 1O ( k 로그k )
경우 ,이 값은 최적의 크기이고 우리는 두 단계를 건너 뛸 수있다.엘s − 1= L에스
그렇지 않으면 최적의 크기 가 L s - 1 > o ≥ L s를 충족 하고 o > L s 이면 o 중 하나 이상을 같은 크기의 조각으로 자르면 발생합니다. 2 단계는 o 를 결정합니다 .영형엘s − 1> o ≥ L에스o > L에스영형영형
각 스틱 , 1 ≤ i ≤ s 에 대해 다음과 같이 후보 크기 세트를 결정하십시오. 크기 L s 로 자르면 스틱이 r i 피스 (더 짧은 경우 포함) 를 켭니다. 스틱은 모든 값 L i나는1 ≤ i ≤ s엘에스아르 자형나는 , 여기서J≤RI및L에서I엘나는제이j ≤ r나는입니다. (이들이 유일한 후보 크기 인 이유는@ user1990169의 답변을참조하십시오.)엘나는제이< Ls − 1
각 후보 크기마다 발생 빈도를 유지하십시오. 균형 검색 트리를 사용하면 후보 크기의 총 개수가 ∑ i r i ≤ 2 k로 제한되므로 로 수행 할 수 있습니다 .O ( k 로그k )∑나는아르 자형나는≤ 2 K
이제 가장 자주 발생하고 유효한 절단으로 이끄는 후보 크기는 최적의 솔루션을 제공하는 크기입니다. 또한, 후보 크기가 유효한 절단으로 이어지는 경우, 작은 크기도 유효한 절단으로 이어집니다.
우리가 다시 가장 큰 후보 길이를 찾기 위해 이진 검색을 사용할 수 있다는 점에서 유효한 절단에 리드 . 그런 다음이 임계 값까지 후보 길이 집합을 반복하고 O ( k ) 에서 가장 큰 수를 갖는 것을 찾습니다 .O ( k 로그k )O ( k )
초기 정렬을 무시하거나 수행 할 필요가없는 경우 총 런타임은 또는 O ( k log k ) 로 표시됩니다.O ( n 로그n )O ( k 로그k )