พื้นหลัง
ผมได้รับแรงบันดาลใจจาก3Blue1Brown 's ล่าสุดวิดีโอเกี่ยวกับปัญหาสร้อยคอแยก (หรือในขณะที่เขาเรียกมันว่าเป็นปัญหาที่ถูกขโมยสร้อยคอ) และความสัมพันธ์กับทฤษฎีบท Borsuk-ลาม
ในปัญหานี้โจรสองคนได้ขโมยสร้อยคอที่มีค่าซึ่งประกอบด้วยอัญมณีหลายประเภท อัญมณีแต่ละชนิดมีจำนวนเท่ากันและพวกโจรต้องการที่จะแยกอัญมณีแต่ละชนิดให้เท่ากันในหมู่พวกเขาสองคน จับเป็นที่พวกเขาจะต้องทำเช่นนั้นโดยการแยกสร้อยเป็นส่วนที่ต่อเนื่องกันจำนวนหนึ่งและกระจายส่วนระหว่างสองของพวกเขา
นี่คือตัวอย่างที่มีสี่ประเภทอัญมณีแสดงS
, E
, D
และR
(สำหรับไพลินมรกตเพชรและทับทิมตามลำดับ) สมมติว่าสร้อยคอมีดังนี้:
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
มี8
ไพลิน, 10
มรกต, 4
เพชรและ6
ทับทิม เราสามารถแยกสร้อยคอดังนี้:
[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
จากนั้นถ้าเราให้ส่วนที่หนึ่ง, สามและห้าแก่ขโมยหนึ่งและส่วนที่สองและสี่กับขโมยอื่น ๆ แต่ละอันจะจบลงด้วย4
ไพลิน, 5
มรกต, 2
เพชรและ3
ทับทิม:
[S], [S,E,S,D,E,R,S], [R,R,D,E,E,E]
[S], [R,E,S,S,S,D,R,E,E,R,E,D,E],
ใช้0
-indexing [1,2,9,22]
ตัดเหล่านี้เกิดขึ้นในดัชนี
เป้าหมาย
ปรากฎว่าแผนกที่เป็นธรรมดังกล่าวสามารถใช้งานได้ทุกครั้งที่มีn
การตัดมากที่สุดซึ่งn
เป็นประเภทอัญมณีจำนวนเท่าใด งานของคุณคือการเขียนโปรแกรมหรือฟังก์ชั่นที่สมบูรณ์ซึ่งใช้สร้อยคอเป็นอินพุทและเอาท์พุทการแบ่งน้อยที่สุด (จำนวนการตัดน้อยที่สุด)
อินพุต
อินพุตอาจอยู่ในรูปแบบที่สะดวก สร้อยคอควรเป็นลำดับของอัญมณีและไม่มีอะไรเพิ่มเติม เช่นรายการจำนวนเต็มพจนานุกรมที่มีกุญแจซึ่งเป็นตัวแทนประเภทอัญมณีและค่าเป็นรายการดัชนี คุณอาจเลือกที่จะรวมความยาวของสร้อยคอหรือจำนวนอัญมณีที่แตกต่างกัน แต่คุณไม่ควรใช้อินพุตอื่น
คุณอาจคิดว่าสร้อยคออินพุตนั้นถูกต้อง คุณไม่จำเป็นต้องจัดการกับกรณีที่มีอัญมณีแปลก ๆ จำนวนหนึ่งหรือสร้อยคอนั้นว่างเปล่า
เอาท์พุต
อีกครั้งเอาต์พุตอาจอยู่ในรูปแบบที่สะดวก เช่นรายการของเซ็กเมนต์, รายการของตำแหน่งที่ตัด, พจนานุกรมที่มีกุญแจซึ่งเป็นตัวแทนของขโมยสองคนและค่านิยมที่เป็นรายการของเซกเมนต์ ฯลฯ ส่วนต่างๆอาจแสดงโดยดัชนีเริ่มต้นของพวกเขา, ดัชนีสิ้นสุด, รายการดัชนีต่อเนื่อง, รายการอัญมณี ความยาวของพวกเขา ฯลฯ คุณสามารถใช้0
- หรือ1
- การจัดทำดัชนี หากการสั่งซื้อไม่สำคัญกับรูปแบบของคุณผลลัพธ์ของคุณอาจอยู่ในลำดับใดก็ได้ นี่คือผลลัพธ์ข้างต้นในหลายรูปแบบ:
list of segments: [[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
list of cuts: [1,2,9,22]
list of lengths: [1,1,7,13,6]
dictionary: {'thief1' : [(R,R,D,E,E,E),(S),(S,E,S,D,E,R,S)], 'thief2' : [(S),(R,E,S,S,S,D,R,E,E,R,E,D,E)]}
โปรดทราบว่าคำสั่งนั้นสำคัญในรายการของเซกเมนต์ (เซกเมนต์สำรองระหว่างขโมย) และรายการของความยาว (เพื่อระบุเซกเมนต์) แต่ไม่ได้อยู่ในรายการของการตัดหรือพจนานุกรม แก้ไข: Greg Martin ชี้ให้เห็นว่าสิ่งเหล่านี้จะไม่เป็นผลลัพธ์ที่ถูกต้องเนื่องจากสามารถแบ่งแผนกออกเป็นสองส่วนได้
กรณีทดสอบ
[1,2,1,2,1,3,1,3,3,2,2,3] -> [[1,2,1],[2,1,3,1],[3,3,2],[2,3]]
[1,1,1,1,2,2,3,3,3,3,3,3] -> [[1,1],[1,1,2],[2,3,3,3],[3,3,3]]
[1,1,1,1,1,1,1,1,1,1,1,1] -> [[1,1,1,1,1,1],[1,1,1,1,1,1]]
[1,1,1,1,2,3,4,2,3,4,2,2] -> [[1,1],[1,1,2,3,4,2],[3,4,2,2]]
หมายเหตุ
- ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
- นี่คือรหัสกอล์ฟ ; คำตอบที่สั้นที่สุด (เป็นไบต์) ชนะ
[S,S,S,E,S,D,E,R,S,R,E,S,S,S,D,R,E,E,R,E,D,E,R,R,D,E,E,E]
มันก็ดูเหมือนว่าการส่งออกควรจะนับตั้งแต่ที่มีการปรับลดน้อยกว่า[[S,S,S,E,S,D,E,R],[S,R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
[[S],[S],[S,E,S,D,E,R,S],[R,E,S,S,S,D,R,E,E,R,E,D,E],[R,R,D,E,E,E]]
ฉันเข้าใจสเป็คอย่างถูกต้องหรือไม่?