สมมติว่ามีคนงาน N ผู้ปฏิบัติงานแต่ละคนมีพารามิเตอร์คุณภาพ พนักงานคนที่ i มีคุณภาพ[i] และค่าจ้างขั้นต่ำที่คาดหวัง[i] ตอนนี้เราต้องการจ้างคนงาน K เพื่อจัดตั้งกลุ่มที่ได้รับค่าจ้าง เมื่อเราจ้างคนงานกลุ่ม K เราต้องจ่ายตามกฎต่อไปนี้ -
-
พนักงานแต่ละคนในกลุ่มที่ได้รับค่าจ้างควรได้รับค่าจ้างตามอัตราส่วนของคุณภาพโดยเปรียบเทียบกับคนอื่นๆ ในกลุ่มที่ได้รับค่าจ้าง
-
คนงานทุกคนในกลุ่มที่ได้รับค่าจ้างต้องได้รับค่าจ้างอย่างน้อยตามที่คาดหวังไว้
เราต้องหาจำนวนเงินที่น้อยที่สุดที่จำเป็นในการจัดตั้งกลุ่มที่ได้รับค่าตอบแทนตามเงื่อนไขข้างต้น
ดังนั้น หากอินพุตมีคุณภาพเท่ากับ =[10,22,5] ค่าจ้าง =[70,52,30] และ K =2 ผลลัพธ์จะเป็น 105.000 เนื่องจากเราจะจ่าย 70 ให้กับคนงานคนแรกและ 35 คนให้กับคนงานคนที่ 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดข้อมูลด้วย q, w และ r
-
n :=ขนาดของคุณภาพ
-
สร้างอาร์เรย์ Data v ขนาด n
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
q ของ v[i] :=quality[i]
-
w ของ v[i] :=ค่าจ้าง[i]
-
r ของ v[i] :=w ของ v[i] /q ของ v[i]
-
-
จัดเรียงอาร์เรย์ v ตามค่า r
-
อุณหภูมิ :=0
-
ผลรวม :=0
-
ตอบ :=inf
-
กำหนดลำดับความสำคัญหนึ่งคิว pq
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้าขนาดของ pq เท่ากับ k แล้ว −
-
x :=องค์ประกอบด้านบนของ pq
-
ผลรวม :=ผลรวม - x
-
ลบองค์ประกอบออกจาก pq
-
-
ถ้าขนาดของ pq เท่ากับ k - 1 แล้ว −
-
ans :=ขั้นต่ำของ (ผลรวม * r ของ v[i]) + w ของ v[i] และ ans
-
-
sum :=sum + q ของ v[i]
-
แทรก q ของ v[i] ลงใน pq
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; struct Data { double q, w, r; }; class Solution { public: static bool cmp(Data a, Data b) { return a.r < b.r; } double mincostToHireWorkers(vector<int> &quality, vector<int> &wage, int k) { int n = quality.size(); vector<Data> v(n); for (int i = 0; i < n; i++) { v[i].q = quality[i]; v[i].w = wage[i]; v[i].r = v[i].w / v[i].q; } sort(v.begin(), v.end(), cmp); double temp = 0; double sum = 0; double ans = INT_MAX; priority_queue<int> pq; for (int i = 0; i < n; i++) { if (pq.size() == k) { double x = pq.top(); sum -= x; pq.pop(); } if (pq.size() == k - 1) { ans = min((sum * v[i].r) + v[i].w, ans); } sum += v[i].q; pq.push(v[i].q); } return ans; } }; main(){ Solution ob; vector<int> v = {10,22,5}, v1 = {70,52,30}; cout << (ob.mincostToHireWorkers(v, v1, 2)); }
อินพุต
{10,22,5} {70,52,30} 2
ผลลัพธ์
105