ধরুন আমাদের কাছে পারফরম্যান্স এবং খরচ নামে একই দৈর্ঘ্যের সংখ্যার দুটি তালিকা রয়েছে। এবং আমাদের আরও একটি সংখ্যা 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
আকারের একটি অ্যারে সেক সংজ্ঞায়িত করুন -
0 থেকে n−1
মান দিয়ে seq পূরণ করুন -
এই মানদণ্ডের উপর ভিত্তি করে অ্যারে সেক সাজান (c[i] * p[j]
-
উত্তর :=inf, psum :=0
-
একটি অগ্রাধিকার সারি সংজ্ঞায়িত করুন pq
-
আরম্ভ করার জন্য i :=0, যখন i
-
idx :=seq[i]
-
pq
-এ p[idx] ঢোকান -
psum :=psum + p[idx]
-
যদি pq> k এর আকার হয়, তাহলে −
-
psum :=psum − pq
এর শীর্ষ উপাদান -
pq
থেকে শীর্ষ উপাদান মুছুন
-
-
যদি i>=k − 1, তাহলে −
-
উত্তর :=সর্বনিম্ন উত্তর এবং (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