Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

โปรแกรมหาต้นทุนขั้นต่ำส่งคนเท่ากันไปสองเมืองใน Python


คำอธิบายปัญหา

กำหนดลิสต์ costs โดย costs[i] = [c1, c2] = ค่าใช้จ่ายส่งคนที่ i ไปเมือง 0 และเมือง 1 ต้องการส่งคนครึ่งหนึ่งไปเมือง 0 อีกครึ่งไปเมือง 1 หาต้นทุนรวมน้อยที่สุด

ตัวอย่าง

costs = [[2,6],[10,3],[4,9],[5,8]] → Output: 17

  • คน 0 และ 2 ไปเมือง 0: 2 + 4 = 6
  • คน 1 และ 3 ไปเมือง 1: 3 + 8 = 11
  • รวม = 17

ขั้นตอนการแก้ปัญหา (Greedy + Sorting)

  1. สมมติส่งทุกคนไปเมือง 0 ก่อน: s = sum(x for x,y in costs)
  2. คำนวณ "ความต่าง" หากส่งไปเมือง 1 แทน: a = [y - x for x,y in costs]
  3. เรียง a จากน้อยไปมาก (ค่าติดลบ = คุ้มกว่าไปเมือง 1)
  4. เลือกครึ่งแรกของ a (n/2 คน) บวกเข้ากับ s

การตนการทำงาน (Python)

def solve(costs):
    s = 0
    a = []
    for x, y in costs:
        s += x
        a.append(y - x)
    a.sort()
    for i in range(len(a) // 2):
        s += a[i]
    return s

costs = [[2, 6], [10, 3], [4, 9], [5, 8]]
print(solve(costs))  # Output: 17

อินพุต / เอาต์พุต

Input:  [[2, 6], [10, 3], [4, 9], [5, 8]]
Output: 17