สมมติว่าเรามีรายการตัวเลขสองรายการที่มีความยาวเท่ากันซึ่งเรียกว่าประสิทธิภาพและค่าใช้จ่าย และเรายังมีเลข k อีกตัว สิ่งเหล่านี้บ่งชี้ว่าผู้ปฏิบัติงานแต่ละคนที่ฉันปฏิบัติงานในระดับประสิทธิภาพ[i] และต้องใช้ต้นทุนอย่างน้อย[i] เราต้องหาต้นทุนขั้นต่ำในการจ้างพนักงาน k เนื่องจากพนักงานจะได้รับค่าตอบแทนตามสัดส่วนผลงานเมื่อเทียบกับพนักงานคนอื่นๆ ในกลุ่ม
ดังนั้น หากอินพุตเป็นเหมือนประสิทธิภาพ =[5, 3, 2] ต้นทุน =[100, 5, 4] k =2 ผลลัพธ์จะเป็น 10 เนื่องจากเราสามารถเลือก emp1 และ emp2 ได้ ต้องชำระอย่างน้อย 5 + 4 =9 จำนวน แต่ emp1 ทำงานได้ดีกว่า emp2 1.5 เท่า ดังนั้นเขาควรได้รับเงินอย่างน้อย 1.5 * 4 =6 ดังนั้นโดยรวมแล้วจะได้ 6 + 4 =10
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
n :=ขนาด c
-
กำหนดลำดับขนาดอาร์เรย์ n
-
เติม seq ด้วยค่า 0 ถึง n-1
-
เรียงลำดับอาร์เรย์ตามเกณฑ์เหล่านี้ (c[i] * p[j]
-
ตอบ :=inf, psum :=0
-
กำหนดลำดับความสำคัญของคิว pq
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
idx :=seq[i]
-
แทรก p[idx] ลงใน pq
-
psum :=psum + p[idx]
-
ถ้าขนาดของ pq> k แล้ว −
-
psum :=psum − องค์ประกอบด้านบนของ pq
-
ลบองค์ประกอบด้านบนออกจาก pq
-
-
ถ้า i>=k − 1 แล้ว −
-
ans :=ขั้นต่ำของ ans และ (c[idx] / p[idx] * psum)
-
-
-
กลับมาอีกครั้ง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; double solve(vector<int>& p, vector<int>& c, int k) { int n = c.size(); vector<int> seq(n); for (int i = 0; i < n; ++i) seq[i] = i; sort(seq.begin(), seq.end(), [&](int i, int j) { return c[i] * p[j] < c[j] * p[i]; }); double ans = INT_MAX, psum = 0; priority_queue<int> pq; for (int i = 0; i < n; ++i) { int idx = seq[i]; pq.emplace(p[idx]); psum += p[idx]; if (pq.size() > k) { psum −= pq.top(); pq.pop(); } if (i >= k − 1) ans = min(ans, (double)c[idx] / p[idx] * psum); } return ans; } int main(){ vector<int> performance = {5, 3, 2}; vector<int> costs = {100, 5, 4}; int k = 2; cout << solve(performance, costs, k); }
อินพุต
{5, 3, 2}, {100, 5, 4}, 2
ผลลัพธ์
10