พื้นหลัง
ลองนึกภาพสักครู่ว่าคุณมีงานที่น่าเบื่ออย่างเหลือเชื่อ ทุกเช้าคุณจะได้รับชุดของงานที่คุณควรทำงานในวันนั้น แต่ละงานมีระยะเวลาแน่นอนและเมื่อเริ่มต้นแล้วจะต้องทำให้สำเร็จในครั้งเดียว เจ้านายของคุณจะไม่ยอมเกียจคร้านดังนั้นถ้ามีงานที่คุณยังสามารถทำให้เสร็จก่อนกลับบ้านคุณจะต้องทำงานกับสิ่งใดสิ่งหนึ่ง (คุณสามารถเลือกได้) ในทางกลับกันถ้างานที่เหลืออยู่ทั้งหมดจะทำให้คุณต้องทำงานล่วงเวลาคุณจะต้องกลับบ้านก่อน! ดังนั้นเป้าหมายของคุณคือการลดระยะเวลาการทำงานของคุณให้สั้นที่สุดด้วยการกำหนดตารางเวลาที่ชาญฉลาด
ความจริงแล้วสนุก: นี่เป็นหนึ่งในตัวแปรของปัญหาการจัดตารางเวลาขี้เกียจของระบบราชการและมันเป็นปัญหาที่ยาก ( แหล่งที่มา )
อินพุต
คุณมีสองอินพุต: จำนวนของ "หน่วยเวลา" ในวันทำงานของคุณ (จำนวนเต็มบวกL
) และการรวบรวมงาน (อาร์เรย์ที่ไม่ว่างของจำนวนเต็มบวกT
แสดงถึงระยะเวลาของงาน) พวกเขาสามารถดำเนินการในลำดับใด ๆ และในรูปแบบที่เหมาะสม อาร์เรย์T
อาจจะมีงานที่มีระยะเวลามากกว่าแต่ก็รับประกันได้ว่าจะมีอย่างน้อยหนึ่งงานที่มีระยะเวลาที่มากที่สุดL
L
เอาท์พุต
ตารางเวลาที่ถูกต้องเป็นส่วนหนึ่งของงานS ⊆ T
ดังกล่าวที่sum(S) ≤ L
และงานที่ไม่ได้อยู่ในทุกS
(multiplicities นับ) L - sum(S)
มีระยะเวลาอย่างเคร่งครัดมากกว่า ผลลัพธ์ของคุณจะเป็นผลรวมที่น้อยที่สุดที่เป็นไปได้ของกำหนดการที่ถูกต้อง กล่าวอีกนัยหนึ่งคุณจะแสดงจำนวนหน่วยเวลาที่น้อยที่สุดที่คุณต้องทำงานในวันนี้
ตัวอย่าง
พิจารณาอินพุต
L = 9
T = [3,4,4,4,2,5]
วิธีหนึ่งในการกำหนดวันของคุณคือ[4,4]
: คุณทำงานสองอย่างให้เสร็จใน 8 หน่วยเวลาและเหลือ 1 หน่วย เนื่องจากไม่มีงาน 1 หน่วยคุณจึงสามารถกลับบ้านได้ อย่างไรก็ตามกำหนดการ[2,5]
ดียิ่งขึ้น: คุณทำงานเป็นเวลา 7 หน่วยแล้วงานที่เหลือทั้งหมดจะใช้เวลา 3 หน่วยขึ้นไป กำหนดการ[2,4]
ไม่ถูกต้องเนื่องจากหลังจากทำงานเป็นเวลา 6 หน่วยคุณยังมีเวลามากพอที่จะทำงาน 3 หน่วยให้เสร็จได้ 7 7
หน่วยจะออกมาเป็นที่ดีที่สุดเพื่อให้การส่งออกที่ถูกต้องคือ
กฎและการให้คะแนน
คุณสามารถเขียนโปรแกรมเต็มหรือฟังก์ชั่น จำนวนไบต์ต่ำสุดที่ชนะและช่องโหว่มาตรฐานไม่ได้รับอนุญาต ไม่มีเวลาผูกมัดดังนั้นการบังคับเดรัจฉานจึงเป็นที่ยอมรับอย่างสมบูรณ์
กรณีทดสอบ
L T -> output
เหล่านี้จะได้รับในรูปแบบ
1 [1,2] -> 1
6 [4,1] -> 5
7 [7,7,9] -> 7
9 [3,4,4,4,2,5] -> 7
20 [6,2,3,12,7,31] -> 17
42 [7,7,7,7,8,8,8] -> 36
42 [7,7,7,7,7,8,8,8] -> 35
42 [7,7,7,7,7,7,8,8,8] -> 36
16 [1,2,3,4,5,6,7,8,9,10] -> 13
37 [15,27,4,1,19,16,20,26,29,18] -> 23
22 [24,20,8,8,29,16,5,5,16,18,4,9] -> 18
80 [10,22,11,2,28,20,27,6,24,9,10,6,27,2,15,29,27] -> 71
59 [26,28,5,4,7,23,5,1,9,3,7,15,4,23,7,19,16,25,26] -> 52