Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में K श्रमिकों को काम पर रखने की न्यूनतम लागत

मान लीजिए कि एन कार्यकर्ता हैं। प्रत्येक कार्यकर्ता के पास गुणवत्ता पैरामीटर होता है। i-th कार्यकर्ता के पास एक गुणवत्ता [i] और न्यूनतम मजदूरी अपेक्षा मजदूरी [i] है। अब हम एक सशुल्क समूह बनाने के लिए K कार्यकर्ताओं को काम पर रखना चाहते हैं। जब हम K कर्मचारियों के एक समूह को काम पर रख रहे हैं, तो हमें उन्हें निम्नलिखित नियमों के अनुसार भुगतान करना होगा -

  • सशुल्क समूह के प्रत्येक कर्मचारी को भुगतान किए गए समूह में अन्य लोगों के साथ तुलना करके उनकी गुणवत्ता के अनुपात में भुगतान किया जाना चाहिए।

  • सशुल्क समूह के प्रत्येक कर्मचारी को कम से कम उनकी न्यूनतम वेतन अपेक्षा का भुगतान किया जाना चाहिए।

हमें उपरोक्त शर्तों को पूरा करने वाला एक भुगतान समूह बनाने के लिए आवश्यक न्यूनतम राशि का पता लगाना होगा।

इसलिए, यदि इनपुट गुणवत्ता =[10,22,5], वेतन =[70,52,30] और के =2 की तरह है, तो आउटपुट 105.000 होगा। ऐसा इसलिए है क्योंकि हम पहले कर्मचारी को 70 और तीसरे कर्मचारी को 35 का भुगतान करेंगे।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • डेटा को q, w और r के साथ परिभाषित करें

  • n :=गुणवत्ता का आकार

  • n आकार के डेटा v की एक सरणी बनाएं

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • v का q[i] :=गुणवत्ता[i]

    • डब्ल्यू का वी[i] :=मजदूरी[i]

    • r का v[i] :=w का v[i] /q का v[i]

  • r मानों के आधार पर सरणी v को क्रमबद्ध करें

  • अस्थायी:=0

  • योग :=0

  • Ans :=inf

  • एक प्राथमिकता कतार pq परिभाषित करें

  • इनिशियलाइज़ i :=0 के लिए, जब i

    • यदि pq का आकार k के समान है, तो -

      • x :=pq का शीर्ष अवयव

      • योग :=योग - x

      • pq से तत्व हटाएं

    • यदि pq का आकार k-1 के समान है, तो -

      • Ans :=न्यूनतम (योग * r का v[i]) + w का v[i] और ans

    • योग :=योग + q का v[i]

    • pq में v[i] का q डालें

  • वापसी उत्तर

आइए बेहतर समझ पाने के लिए निम्नलिखित कार्यान्वयन देखें -

उदाहरण

#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

  1. बोर्ड को C++ में वर्गों में काटने की न्यूनतम लागत

    अवधारणा मान लीजिए कि लंबाई p और चौड़ाई q का एक बोर्ड दिया गया है, हमें इस बोर्ड को p*q वर्गों में तोड़ने की आवश्यकता है ताकि तोड़ने की लागत कम से कम हो। इस बोर्ड के लिए हर किनारे के लिए कटिंग कॉस्ट दी जाएगी। संक्षेप में, हमें काटने के ऐसे क्रम का चयन करने की आवश्यकता है जिससे लागत कम से कम हो। उदाह

  1. C++ में बाइनरी ट्री की न्यूनतम गहराई

    मान लीजिए हमारे पास एक बाइनरी ट्री है; हमें उस वृक्ष की न्यूनतम गहराई ज्ञात करनी है। जैसा कि हम जानते हैं कि न्यूनतम गहराई रूट नोड से निकटतम लीफ नोड तक सबसे छोटे पथ के साथ नोड्स की संख्या है। तो, अगर इनपुट पसंद है तो आउटपुट 2 . होगा इसे हल करने के लिए, हम इन चरणों का पालन करेंगे - ट्री नोड्स

  1. C++ में न्यूनतम नाइट मूव्स

    मान लीजिए कि हमारे पास एक अनंत शतरंज की बिसात है जिसमें -infinity से +infinity तक के निर्देशांक हैं, और हमारे पास वर्ग [0, 0] पर एक नाइट है। एक शूरवीर के पास 8 संभावित चालें हैं, जैसा कि नीचे दिखाया गया है। प्रत्येक चाल एक कार्डिनल दिशा में दो वर्ग है, फिर एक वर्ग एक ओर्थोगोनल दिशा में है। हमें न