บทสรุปผู้บริหาร
ป้อนข้อมูลk
ให้ค้นหาพาร์ทิชันของจำนวนเต็ม1
เพื่อn
เป็นk
ส่วนย่อยฟรีสำหรับที่ใหญ่ที่สุดที่n
คุณสามารถภายใน 10 นาที
พื้นหลัง: หมายเลข Schur
ชุดA
คือผลรวมฟรีถ้าผลรวมของตนเองA + A = { x + y | x, y in A}
มีองค์ประกอบที่ไม่มีในการร่วมกันกับมัน
สำหรับเลขจำนวนเต็มบวกทุกตัวk
จะมีจำนวนเต็มที่มากที่สุดS(k)
ซึ่งชุด{1, 2, ..., S(k)}
นั้นสามารถแบ่งพาร์ติชันเป็นk
เซ็ตย่อยที่ไม่มีผลรวมได้ หมายเลขนี้เรียกว่าหมายเลข k th Schur (OEIS A045652 )
ตัวอย่างเช่นS(2) = 4
. เราสามารถแบ่งพาร์ติชัน{1, 2, 3, 4}
เป็น{1, 4}, {2, 3}
และนั่นคือพาร์ติชันที่ไม่ซ้ำกันในชุดย่อยที่ไม่มีผลรวมสองชุด แต่ตอนนี้เราไม่สามารถเพิ่ม5
ส่วนใดส่วนหนึ่งได้
ท้าทาย
เขียนโปรแกรมกำหนดขึ้นซึ่งทำสิ่งต่อไปนี้:
- ใช้จำนวนเต็มบวก
k
เป็นอินพุต - เขียนการประทับเวลา Unix ปัจจุบันเพื่อ stdout
- ขาออกลำดับของพาร์ทิชันของ
1
การn
เข้าไปในk
ส่วนย่อยรวมฟรีสำหรับเพิ่มขึ้นn
ตามลำดับด้วยเวลา Unix ปัจจุบันแต่ละ
ผู้ชนะจะได้เป็นโปรแกรมที่พิมพ์พาร์ทิชันสำหรับที่ใหญ่ที่สุดn
ภายใน 10 5
นาทีในคอมพิวเตอร์ของฉันเมื่อได้รับการป้อนข้อมูล ความสัมพันธ์จะถูกแบ่งตามเวลาที่เร็วที่สุดเพื่อค้นหาพาร์ติชันสำหรับการn
รันที่ใหญ่ที่สุดโดยเฉลี่ยมากกว่าสามการรันนั่นคือสาเหตุที่เอาต์พุตควรมีการประทับเวลา
รายละเอียดที่สำคัญ:
- ฉันมี Ubuntu ที่แม่นยำดังนั้นหากภาษาของคุณไม่รองรับฉันจะไม่สามารถให้คะแนนได้
- ฉันมีซีพียู Intel Core2 Quad ดังนั้นหากคุณต้องการใช้มัลติเธรดไม่ต้องใช้หัวข้อมากกว่า 4 เธรด
- หากคุณต้องการให้ฉันใช้ธงคอมไพเลอร์ใด ๆ หรือการใช้งานเอกสารที่ชัดเจนในคำตอบของคุณ
5
คุณจะไม่กรณีพิเศษรหัสของคุณจะจัดการกับการป้อนข้อมูล- คุณไม่จำเป็นต้องแสดงผลการปรับปรุงทุกอย่างที่คุณพบ เช่นสำหรับการป้อนข้อมูลที่คุณสามารถส่งออกเพียงพาร์ทิชันสำหรับ
2
n = 4
แต่ถ้าคุณจะทำอะไรไม่ได้การส่งออกในช่วง 10n = 0
นาทีแรกแล้วฉันจะทำประตูได้ว่าเป็น
n=59
และการเรียงลำดับตามจำนวนที่ยิ่งใหญ่ที่สุดของตัวเลขที่ได้รับอนุญาตให้น้อยกว่าให้nextN
n=64
การเรียงลำดับตามความยาวของรายการหมายเลขที่ไม่อนุญาต (ซึ่งอาจมีซ้ำ) จะนำไปสู่n=30
รูปแบบที่สวยงาม