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

C++ में कर्मचारियों के प्रदर्शन के आधार पर भुगतान की जाने वाली अंतिम राशि ढूंढने का प्रोग्राम


परिचय

मान लीजिए हमारे पास समान लंबाई की दो संख्या सूचियाँ हैं जिन्हें performance और costs कहा जाता है। और हमारे पास एक और संख्या k है। ये इंगित करते हैं कि प्रत्येक कर्मचारी i performance[i] स्तर पर प्रदर्शन करता है और इसकी लागत कम से कम costs[i] है। हमें k कर्मचारियों को हायर करने की न्यूनतम लागत ढूंढनी है, यह देखते हुए कि कर्मचारियों को समूह में अन्य कर्मचारियों की तुलना में उनके प्रदर्शन के अनुपात में भुगतान किया जाएगा।

तो, यदि इनपुट performance = [5, 3, 2], costs = [100, 5, 4], k = 2 है, तो आउटपुट 10 होगा, क्योंकि हम emp1 और emp2 चुन सकते हैं। उन्हें कम से कम 5 + 4 = 9 राशि का भुगतान किया जाना चाहिए। लेकिन emp1, emp2 से 1.5 गुना बेहतर प्रदर्शन करता है, इसलिए उसे कम से कम 1.5 * 4 = 6 भुगतान किया जाना चाहिए। तो कुल मिलाकर उन्हें 6 + 4 = 10 मिलेगा।

समाधान दृष्टिकोण

कर्मचारियों को cost/performance अनुपात के आधार पर सॉर्ट करें। फिर एक मैक्स-हीप का उपयोग करके शीर्ष k प्रदर्शनकर्ताओं को ट्रैक करें। प्रत्येक कर्मचारी को "कैप्टन" मानकर न्यूनतम लागत की गणना करें।

उदाहरण कोड

#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);
    return 0;
}

इनपुट

{5, 3, 2}, {100, 5, 4}, 2

आउटपुट

10

निष्कर्ष

यह लालची (greedy) + हीप दृष्टिकोण O(n log n) समय में इष्टतम समाधान ढूंढता है। कर्मचारियों को इकाई प्रदर्शन लागत के आधार पर सॉर्ट किया जाता है। यदि आपके कोई प्रश्न हैं, तो कमेंट सेक्शन में पूछें।


  1. ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम ग्राफ से घटाए जा सकने वाले अधिकतम स्कोर की मात्रा ज्ञात करने का C++ प्रोग्राम

    मान लीजिए n वर्टेक्स और m एज वाला एक भारित, निदेश रहित ग्राफ दिया गया है। ग्राफ का स्कोर ग्राफ में सभी एज भारों का योग है। एज भार ऋणात्मक हो सकते हैं, और यदि उन्हें हटा दिया जाए तो ग्राफ का स्कोर बढ़ जाता है। हमें ग्राफ को संबद्ध रखते हुए एज हटाकर ग्राफ के स्कोर को न्यूनतम करना है। हमें घटाए जा सकन

  1. - C++ प्रोग्राम: 'k' खोजें जैसे कि प्रत्येक एरे तत्व के साथ इसका मॉड्यूलस समान हो

    इस लेख में, हम एक प्रोग्राम पर चर्चा करेंगे जो एक पूर्णांक k खोजता है, जैसे कि दिए गए एरे के प्रत्येक तत्व के साथ इसका मॉड्यूलस समान हो। उदाहरण के लिए, मान लीजिए हमें एक एरे दिया गया है, arr = {12, 22, 32} तो हमारे पास आउटपुट मान k = 1, 2, 5, 10 होगा। y)। तब हमारे पास (y + अंतर) % k = y % k होगा।

  1. - C++ प्रोग्राम: ग्राफ मैट्रिक्स का व्युत्क्रम (Inverse) ज्ञात करना

    यह एक C++ प्रोग्राम है जो ग्राफ मैट्रिक्स का व्युत्क्रम ज्ञात करता है। मैट्रिक्स का व्युत्क्रम केवल तभी मौजूद होता है जब मैट्रिक्स नॉन-सिंगुलर हो यानी डिटरमिनेंट 0 नहीं होना चाहिए। मैट्रिक्स का व्युत्क्रम कई तरीकों से ज्ञात किया जा सकता है। यहां हम एडजॉइंट मैट्रिक्स और उसके डिटरमिनेंट का उपयोग करके