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

โปรแกรมหาต้นทุนขั้นต่ำในการจ้างคนงาน k ใน Python


สมมติว่าเรามีอาร์เรย์ที่เรียกว่าคุณภาพสำหรับคนงานแต่ละคน และมีอาร์เรย์อื่นที่เรียกว่าค่าจ้างและค่า K ผู้ปฏิบัติงานที่ i มีคุณภาพ[i] และค่าจ้างขั้นต่ำที่คาดหวัง[i] เราต้องการจ้างคนงาน K เพื่อจัดตั้งกลุ่มที่ได้รับค่าจ้าง เมื่อเราจ้างคนงานกลุ่ม K เราต้องจ่ายตามกฎต่อไปนี้:

  • ผู้ปฏิบัติงานในกลุ่มที่ได้รับค่าจ้างแต่ละคนควรได้รับค่าจ้างตามอัตราส่วนของคุณภาพโดยเปรียบเทียบกับคนอื่นๆ ในกลุ่มที่ได้รับค่าจ้าง

  • คนงานทุกคนในกลุ่มที่ได้รับค่าจ้างต้องได้รับค่าจ้างอย่างน้อยตามที่คาดหวังไว้

เราต้องหาจำนวนเงินที่น้อยที่สุดที่จำเป็นในการจัดตั้งกลุ่มที่ได้รับค่าตอบแทนตามเงื่อนไขข้างต้น

ดังนั้น หากปัจจัยที่ป้อนเข้ามาเหมือนกับคุณภาพ =[10,22,5] ค่าจ้าง =[70,52,30] และ K =2 ผลลัพธ์จะเป็น 105.000 เพราะเราจะจ่าย 70 ให้กับคนงานคนแรกและ 35 ให้กับคนงาน พนักงานคนที่ 3

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • qr :=รายการใหม่

  • สำหรับแต่ละคู่ (q, w) จากคุณภาพและค่าจ้างทำ

    • แทรก (w/q, q) ต่อท้าย qr

  • เรียงลำดับรายการ qr

  • cand :=รายการใหม่ csum :=0

  • สำหรับฉันอยู่ในช่วง 0 ถึง K - 1 ทำ

    • แทรก -qr[i, 1] ลงใน heap cand

    • csum :=csum + qr[i, 1]

  • ตอบ :=csum * qr[K - 1, 0]

  • สำหรับ idx ในช่วง K ถึงขนาดของคุณภาพ ให้ทำ

    • แทรก -qr[i, 1] ลงใน heap cand

    • csum :=csum + qr[idx, 1] + องค์ประกอบด้านบนจาก heap cand และลบออกจาก heap

    • ans =ขั้นต่ำของ ans และ (csum * qr[idx][0])

  • กลับมาอีกครั้ง

ตัวอย่าง

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น

import heapq
def solve(quality, wage, K):
   qr = []
   for q, w in zip(quality, wage):
      qr.append([w/q, q])
   qr.sort()

   cand, csum = [], 0
   for i in range(K):
      heapq.heappush(cand, -qr[i][1])
      csum += qr[i][1]
   ans = csum * qr[K - 1][0]

   for idx in range(K, len(quality)):
      heapq.heappush(cand, -qr[idx][1])
      csum += qr[idx][1] + heapq.heappop(cand)
      ans = min(ans, csum * qr[idx][0])
   return ans

quality = [10,22,5]
wage = [70,52,30]
K = 2
print(solve(quality, wage, K))

อินพุต

[10,22,5], [70,52,30], 2

ผลลัพธ์

105