ความท้าทายนี้มาจากการทดสอบการรับเข้าเรียนจนถึงหลักสูตรความปลอดภัยทางไซเบอร์ที่ปิด อย่างไรก็ตามมันไม่ได้เกี่ยวข้องกับการรักษาความปลอดภัยในโลกไซเบอร์ แต่เพียงเพื่อทดสอบทักษะการเขียนโปรแกรมและตรรกะของนักเรียน
งาน
เขียนโปรแกรมที่ลบรายการออกจากอาร์เรย์เพื่อให้ค่าที่เหลือถูกเรียงลำดับในลำดับที่ลดลงอย่างเคร่งครัดและผลรวมของพวกเขาคือค่าสูงสุดในลำดับการลดที่เป็นไปได้อื่น ๆ ทั้งหมด
อินพุตและเอาต์พุต
การป้อนข้อมูลจะมีอาร์เรย์ของค่าจำนวนเต็มอย่างเคร่งครัดมากขึ้นกว่า0
และแตกต่างจากคนอื่น ๆ คุณมีอิสระที่จะเลือกว่าจะอ่านอินพุตจากไฟล์บรรทัดคำสั่งหรือ stdin
เอาต์พุตจะเป็นซับราเรย์ที่เรียงลำดับจากมากไปน้อยของอินพุตหนึ่งซึ่งผลรวมนั้นมีค่าสูงกว่าซับราเรย์ย่อยเรียงจากมากไปน้อยอื่น ๆ ที่เป็นไปได้
หมายเหตุ: [5, 4, 3, 2]
เป็นระบบย่อยของ[5, 4, 1, 3, 2]
แม้ว่า4
และ3
จะไม่ติดกัน เพียงเพราะ1
ถูกตอก
โซลูชั่น Bruteforce
วิธีแก้ปัญหาที่ง่ายที่สุดของหลักสูตรจะวนซ้ำในชุดค่าผสมที่เป็นไปได้ทั้งหมดของอาร์เรย์ที่กำหนดและค้นหาชุดข้อมูลที่เรียงลำดับด้วยผลรวมที่ยิ่งใหญ่ที่สุดซึ่งจะเป็นในPython :
import itertools
def best_sum_desc_subarray(ary):
best_sum_so_far = 0
best_subarray_so_far = []
for k in range(1, len(ary)):
for comb in itertools.combinations(ary, k):
if sum(comb) > best_sum_so_far and all(comb[j] > comb[j+1] for j in range(len(comb)-1)):
best_subarray_so_far = list(comb)
best_sum_so_far = sum(comb)
return best_subarray_so_far
น่าเสียดายเนื่องจากการตรวจสอบว่าอาร์เรย์เรียงลำดับและคำนวณผลรวมขององค์ประกอบหรือไม่และเนื่องจากการดำเนินการนี้จะทำเวลาตั้งแต่ไปจนถึงความซับซ้อนของเวลาแบบอะซิมโทติค
ท้าทาย
เป้าหมายของคุณคือการทำให้เวลามีความซับซ้อนดีขึ้น การแก้ปัญหาด้วยเวลาที่ซับซ้อนเชิงเวลาน้อยที่สุดคือผู้ชนะของการท้าทาย หากสองวิธีมีความซับซ้อนของเวลาแบบอะซิมโทติคผู้ชนะจะเป็นแบบที่มีความซับซ้อนเชิงพื้นที่แบบขนาดเล็กที่สุด
หมายเหตุ: คุณสามารถพิจารณาการอ่านการเขียนและการเปรียบเทียบอะตอมแม้เป็นจำนวนมาก
หมายเหตุ: หากมีสองวิธีหรือมากกว่านั้นให้ส่งคืนทั้งสองวิธี
กรณีทดสอบ
Input: [200, 100, 400]
Output: [400]
Input: [4, 3, 2, 1, 5]
Output: [4, 3, 2, 1]
Input: [50, 40, 30, 20, 10]
Output: [50, 40, 30, 20, 10]
Input: [389, 207, 155, 300, 299, 170, 158, 65]
Output: [389, 300, 299, 170, 158, 65]
Input: [19, 20, 2, 18, 13, 14, 8, 9, 4, 6, 16, 1, 15, 12, 3, 7, 17, 5, 10, 11]
Output: [20, 18, 16, 15, 12, 7, 5]
Input: [14, 12, 24, 21, 6, 10, 19, 1, 5, 8, 17, 7, 9, 15, 23, 20, 25, 11, 13, 4, 3, 22, 18, 2, 16]
Output: [24, 21, 19, 17, 15, 13, 4, 3, 2]
Input: [25, 15, 3, 6, 24, 30, 23, 7, 1, 10, 16, 29, 12, 13, 22, 8, 17, 14, 20, 11, 9, 18, 28, 21, 26, 27, 4, 2, 19, 5]
Output: [25, 24, 23, 22, 17, 14, 11, 9, 4, 2]