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

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

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

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

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

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

उदाहरण के लिए, यदि quality = [10,22,5], wage = [70,52,30] और K = 2, तो आउटपुट 105.000 होगा।

हल करने का दृष्टिकोण

हम मजदूरी/गुणवत्ता अनुपात के आधार पर लालची दृष्टिकोण और प्रायोरिटी क्यू का उपयोग करते हैं:

  • प्रत्येक श्रमिक के लिए अनुपात r = wage/quality की गणना करें

  • श्रमिकों को अनुपात r के अनुसार सॉर्ट करें

  • सबसे बड़ी गुणवत्ता वाले K-1 श्रमिकों को ट्रैक करने के लिए मैक्स-हीप बनाए रखें

  • प्रत्येक श्रमिक को "कैप्टन" (उच्चतम अनुपात) के रूप में मानें

  • लागत = (K-1 श्रमिकों की गुणवत्ता का योग + कैप्टन की गुणवत्ता) * कैप्टन का अनुपात

  • न्यूनतम लागत ट्रैक करें

उदाहरण

#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; 
    } 
}; 

int main(){ 
    Solution ob; 
    vector<int> v = {10,22,5}, v1 = {70,52,30}; 
    cout << (ob.mincostToHireWorkers(v, v1, 2)); 
    return 0;
}

इनपुट

{10,22,5} {70,52,30} 2

आउटपुट

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

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

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

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

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

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