สมมติว่าเรามีอาร์เรย์ที่เรียกว่าคุณภาพสำหรับคนงานแต่ละคน และมีอาร์เรย์อื่นที่เรียกว่าค่าจ้างและค่า 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