นักเดินทางต้องพักเป็นเวลาnวันในโรงแรมนอกเมือง เขาไม่มีเงินสดและบัตรเครดิตของเขาหมดอายุ แต่เขามีโซ่ทองกับnการเชื่อมโยง
กฎในโรงแรมนี้คือผู้อยู่อาศัยควรจ่ายค่าเช่าทุกเช้า นักเดินทางมาถึงข้อตกลงกับผู้จัดการเพื่อจ่ายลิงค์หนึ่งของโซ่ทองในแต่ละวัน แต่ผู้จัดการยังต้องการให้นักเดินทางควรสร้างความเสียหายให้กับโซ่น้อยที่สุดในขณะที่จ่ายเงินทุกวัน กล่าวอีกนัยหนึ่งเขาต้องหาวิธีแก้ปัญหาเพื่อตัดลิงก์ให้น้อยที่สุดเท่าที่จะทำได้
การตัดการเชื่อมโยงสร้างสาม subchains: หนึ่งประกอบด้วยการเชื่อมโยง cut เท่านั้นและอีกหนึ่งในแต่ละด้าน ตัวอย่างเช่นการตัดลิงค์ที่สามของสายโซ่ยาว 8 จะสร้างความยาวย่อย [2, 1, 5] ผู้จัดการมีความสุขที่จะทำการเปลี่ยนแปลงดังนั้นนักเดินทางสามารถชำระเงินในวันแรกด้วยสายโซ่ยาว 1 จากนั้นวันที่สองพร้อมสายโซ่ยาว 2 เพื่อรับห่วงโซ่แรกคืน
รหัสของคุณควรป้อนความยาว nและออกรายการลิงก์เพื่อตัดความยาวต่ำสุด
กฎ :
- nเป็นจำนวนเต็ม> 0
- คุณสามารถใช้การจัดทำดัชนีแบบอิง 0 หรือ 1 ตามลิงก์
- สำหรับตัวเลขบางตัวการแก้ปัญหานั้นไม่ซ้ำกัน ตัวอย่างเช่นถ้า
n = 15
ทั้งสอง[3, 8]
และ[4, 8]
เป็นผลลัพธ์ที่ถูกต้อง - คุณสามารถส่งคืนรายการหรือพิมพ์ด้วยตัวคั่นที่เหมาะสม
- นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ
กรณีทดสอบ :
Input Output (1-indexed)
1 []
3 [1]
7 [3]
15 [3, 8]
149 [6, 17, 38, 79]
ตัวอย่างรายละเอียด
สำหรับn = 15 การตัดลิงก์ 3 และ 8 ให้ผลลัพธ์เป็นความยาว[2, 1, 4, 1, 7]
ย่อย นี่เป็นวิธีแก้ปัญหาที่ถูกต้องเพราะ:
1 = 1
2 = 2
3 = 1+2
4 = 4
5 = 1+4
6 = 2+4
7 = 7
8 = 1+7
9 = 2+7
10 = 1+2+7
11 = 4+7
12 = 1+4+7
13 = 2+4+7
14 = 1+2+4+7
15 = 1+1+2+4+7
ไม่มีวิธีแก้ปัญหาที่มีเพียงการตัดเพียงครั้งเดียวดังนั้นนี่จึงเป็นทางออกที่ดีที่สุด
ภาคผนวก
โปรดทราบว่าปัญหานี้เกี่ยวข้องกับการแบ่งจำนวนเต็ม เรากำลังหาพาร์ติชันPของnซึ่งจำนวนเต็มทั้งหมดจาก 1 ถึงnมี patition อย่างน้อยหนึ่งตัวที่เป็นเซตย่อยของ P
นี่คือวิดีโอ YouTubeเกี่ยวกับอัลกอริทึมที่เป็นไปได้สำหรับปัญหานี้
1+2
แต่ในวันที่สามคุณชำระเงินด้วย 2-link-chain อันที่สองมาจากไหน