ตามที่ @randomA แนะนำเราจะดำเนินการในสองขั้นตอน: ก่อนอื่นเราจะพบชุดของแท่งที่จะถูกตัดแล้วลดจำนวนการตัด
เช่นเดียวกับในกรณีพิเศษในคำถามที่เราเรียงลำดับ / ชื่อไม้เพื่อให้L_n นี้จะใช้เวลาเวลาL1≥L2≥⋯≥LnO(nlogn)
ในฐานะที่เป็น @ user1990169 ชี้ว่าเราไม่เคยมีการตัดชิ้นส่วนki≥k
ในระยะแรกเราใช้การค้นหาแบบไบนารี่เพื่อค้นหาหมายเลข , , เพื่อให้แท่งสามารถตัดเป็นอย่างน้อยชิ้นขนาด (บวกชิ้นเล็ก ๆ ) แต่แท่งไม่สามารถตัดเป็นชิ้นขนาด{s-1} นี้จะใช้เวลาเวลาs1≤s≤k1,…,skLs1,…,s−1kLs−1O(klogk)
ถ้าค่านี้เป็นขนาดที่เหมาะสมและเราสามารถข้ามเฟสที่สองได้Ls−1=Ls
มิฉะนั้นเรารู้ว่าขนาดที่เหมาะสมที่สุดทำให้เป็นไปตามและถ้าแล้วผลลัพธ์จากการตัดไม้อย่างน้อยหนึ่งแท่งเป็นชิ้นขนาดเท่ากัน ระยะที่สองจะกำหนด :oLs−1>o≥Lso>Lsoo
สำหรับแต่ละแท่ง , , กำหนดขนาดของชุดตัวเลือกดังนี้: หากการตัดเป็นชิ้นขนาดจะเปลี่ยนแท่งให้เป็นชิ้น (รวมถึงอันที่สั้นกว่าถ้ามี) จากนั้นผู้สมัครสำหรับ ติดทุกคนค่าที่และ{s-1} (ดูที่คำตอบของ @ user1990169ว่าทำไมขนาดเหล่านี้จึงมีขนาดเท่านั้น)i1≤i≤sLsriLijj≤riLij<Ls−1
รักษาผู้สมัครแต่ละขนาดเท่าไหร่มันเกิดขึ้น การใช้ต้นไม้ค้นหาสมดุลนี้สามารถทำได้ในเนื่องจากจำนวนเสียงทั้งหมดของผู้สมัครขนาดที่ถูกผูกไว้โดย2kO(klogk)∑iri≤2k
ตอนนี้ขนาดของผู้สมัครที่เกิดขึ้นบ่อยที่สุดและนำไปสู่การตัดที่ถูกต้องคือขนาดที่ให้ทางออกที่ดีที่สุดแก่เรา นอกจากนี้หากขนาดตัวเลือกใด ๆ นำไปสู่การตัดที่ถูกต้องขนาดที่เล็กกว่าจะนำไปสู่การตัดที่ถูกต้องเช่นกัน
ดังนั้นเราอีกครั้งสามารถใช้ค้นหา binary ที่จะหาผู้สมัครที่มีความยาวที่ใหญ่ที่สุดที่นำไปสู่การตัดที่ถูกต้องในk) จากนั้นเราก็ย้ำกว่าชุดของความยาวที่ผู้สมัครได้ถึงเกณฑ์นี้และหาหนึ่งที่มีความหลากหลายที่ใหญ่ที่สุดในหมู่พวกเขาในที่(k)O(klogk)O(k)
โดยรวมแล้วเราได้รับ runtime ในหรือถ้าเราไม่สนใจ (หรือไม่ต้องทำ) การเรียงลำดับเริ่มต้นO(nlogn)O(klogk)