เรามีอาร์เรย์ของสมาชิก และต้องทำให้ทุกตัวเท่ากันโดยเพิ่มค่าสมาชิกทีละ 1 เราได้รับอนุญาตให้เพิ่ม n-1 สมาชิกในแต่ละขั้นตอน เป้าหมายคือคำนวณจำนวนการดำเนินการทั้งหมดที่ต้องใช้เพื่อทำให้สมาชิกอาร์เรย์ทั้งหมดเท่ากัน
ตัวอย่าง ถ้ามีลิสต์ [1, 2, 3] ใช้ 3 การดำเนินการเพื่อทำให้ทุกสมาชิกเท่ากัน วิธีแก้หนึ่งคือ หาตัวเลขสูงสุดในแต่ละขั้นตอนและเพิ่มสมาชิกที่เหลือทีละ 1 มาเขียนโค้ดกัน
ตัวอย่าง
def main():
# เริ่มต้นอาร์เรย์
arr = [1, 2, 3]
# เริ่มต้นนับการดำเนินการ
no_of_operations = 0
flag = 0
# ดำเนินการกับอาร์เรย์จนกว่าจะเท่ากัน
while not are_equal(arr):
flag = 1
# หาค่าสูงสุดจากลิสต์
maximum = max(arr)
# เพิ่มสมาชิกทั้งหมดยกเว้นค่าสูงสุด
for i in range(len(arr)):
if arr[i] != maximum:
arr[i] += 1
# เพิ่มจำนวนการดำเนินการ
no_of_operations += 1
print(no_of_operations) if flag == 0 else print(no_of_operations + 1)
# ตรวจสอบว่าสมาชิกทั้งหมดเท่ากันหรือไม่
def are_equal(arr):
global no_of_operations
for i in range(len(arr) - 1):
if arr[i] != arr[i + 1]:
return False
return True
if __name__ == '__main__':
main()
ผลลัพธ์
ถ้ารันโปรแกรมข้างต้น จะได้ผลลัพธ์ดังนี้:
3
วิธีด้านบนใช้เวลานานสำหรับอาร์เรย์ขนาดใหญ่ เราสามารถหาจำนวนการดำเนินการได้โดยหาผลรวมและสมาชิกน้อยที่สุดของอาร์เรย์
- หาผลรวมของอาร์เรย์
- หาสมาชิกน้อยที่สุดของอาร์เรย์
- พิมพ์ค่าจากนิพจน์ sum - (length * smallest)
ตัวอย่าง
ดูโค้ดด้านล่าง
# เริ่มต้นอาร์เรย์ arr = [1, 2, 3] # ความยาว length = len(arr) # ผลรวมของสมาชิกอาร์เรย์ elements_sum = sum(arr) # สมาชิกน้อยที่สุด smallest = min(arr) # คำนวณจำนวนการดำเนินการ print(elements_sum - (length * smallest))
ผลลัพธ์
ถ้ารันโค้ดข้างต้น จะได้ผลลัพธ์ดังนี้:
3
สรุป
วิธีที่สองที่เราอภิปรายง่ายกว่าและใช้เวลาน้อยกว่าวิธีแรกมาก หากมีข้อสงสัยในบทช่วยสอน กรุณาเขียนในส่วนความคิดเห็น