Như @randomA đã đề xuất, chúng tôi sẽ tiến hành theo hai giai đoạn: Trước tiên, chúng tôi tìm thấy bộ gậy sẽ được cắt và sau đó giảm thiểu số lần cắt.
Như trong trường hợp đặc biệt trong câu hỏi, chúng tôi sắp xếp / đặt tên cho các que sao cho . Điều này mất thời gian .L1≥L2≥⋯≥LnO(nlogn)
Như @ user1990169 đã chỉ ra, chúng tôi không bao giờ phải cắt một mảnh .i≥k
Trong giai đoạn đầu tiên, chúng tôi sử dụng tìm kiếm nhị phân để tìm số , , sao cho các que có thể được cắt thành ít nhất phần có kích thước (cộng với một số phần nhỏ hơn) , nhưng các que không thể được cắt thành mảnh có kích thước . Điều này sẽ mất thời gian .s1≤s≤k1,…,skLs1,…,s−1kLs−1O(klogk)
Nếu , giá trị này là kích thước tối ưu và chúng ta có thể bỏ qua giai đoạn hai.Ls−1=Ls
Mặt khác, chúng ta biết rằng kích thước tối ưu thỏa mãn và nếu thì kết quả từ việc cắt ít nhất một trong các que thành các miếng có kích thước bằng nhau. Giai đoạn hai sẽ xác định :oLs−1>o≥Lso>Lsoo
Đối với mỗi thanh , , hãy xác định một tập hợp các kích thước ứng viên như sau: Nếu cắt thành các mảnh có kích thước sẽ biến thanh thành các mảnh (bao gồm cả ngắn hơn, nếu có), thì các ứng cử viên cho điều này thanh là tất cả các giá trị , trong đó và . (Xem câu trả lời của @ user1990169 để biết lý do tại sao đây là các kích thước ứng cử viên duy nhất.)i1≤i≤sLsriLijj≤riLij<Ls−1
Duy trì cho từng kích thước ứng viên, tần suất xảy ra. Sử dụng cây tìm kiếm cân bằng, điều này có thể được thực hiện trong , vì tổng số kích thước ứng cử viên bị ràng buộc bởi .O(klogk)∑iri≤2k
Bây giờ kích thước ứng viên xảy ra thường xuyên nhất và dẫn đến cắt giảm hợp lệ là một trong đó cung cấp cho chúng tôi giải pháp tối ưu. Hơn nữa, nếu bất kỳ kích thước ứng cử viên nào dẫn đến việc cắt hợp lệ, thì bất kỳ kích thước nhỏ hơn nào cũng sẽ dẫn đến việc cắt hợp lệ.
Vì vậy, một lần nữa chúng ta có thể sử dụng tìm kiếm nhị phân để tìm độ dài ứng cử viên lớn nhất dẫn đến việc cắt hợp lệ trong . Sau đó, chúng tôi lặp lại tập hợp các độ dài ứng cử viên cho đến ngưỡng này và tìm ra nhóm có số lượng lớn nhất trong số họ trong .O(klogk)O(k)
Tổng cộng chúng ta có một thời gian chạy trong hoặc , nếu chúng ta bỏ qua (hoặc không phải làm) sắp xếp ban đầu.O(nlogn)O(klogk)