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

C++ में टीम का अधिकतम प्रदर्शन


समस्या विवरण

मान लीजिए n इंजीनियर हैं। उन्हें 1 से n तक नंबर दिया गया है और हमारे पास दो सरणियाँ हैं: speed और efficiency, यहां speed[i] और efficiency[i] i-वें इंजीनियर की गति और दक्षता को दर्शाते हैं। हमें अधिकतम k इंजीनियरों से बनी टीम का अधिकतम प्रदर्शन ज्ञात करना है। उत्तर बहुत बड़ा हो सकता है इसलिए इसे 10^9 + 7 से मॉड्यूलो करके लौटाएं।

यहां एक टीम का प्रदर्शन उनके इंजीनियरों की गति के योग को उनकी न्यूनतम दक्षता से गुणा करके प्राप्त होता है।

उदाहरण

यदि इनपुट है: n = 6, speed = [1,5,8,2,10,3], efficiency = [9,7,2,5,4,3], k = 2, तो आउटपुट होगा 60, क्योंकि टीम का अधिकतम प्रदर्शन गति 10 और दक्षता 4 वाले इंजीनियर और गति 5 और दक्षता 7 वाले इंजीनियर को चुनकर प्राप्त होता है। यानी, प्रदर्शन = (10 + 5) * min(4, 7) = 60।

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

इस समस्या को हल करने के लिए निम्नलिखित चरणों का पालन करें (लालची + प्रायोरिटी क्यू):

  • ret := 0
  • एक 2D सरणी v परिभाषित करें
  • i := 0 से आरंभ करें, जब i < n, i को 1 से बढ़ाते हुए:
    • {e[i], s[i]} को v के अंत में डालें
  • सरणी v को रिवर्स क्रम में सॉर्ट करें
  • एक प्रायोरिटी क्यू pq परिभाषित करें
  • sum := 0
  • i := 0 से आरंभ करें, जब i < n, i को 1 से बढ़ाते हुए:
    • यदि pq का आकार, k के समान है:
      • sum := sum - pq का शीर्ष तत्व
      • pq से तत्व हटाएं
    • sum := sum + v[i][1]
    • v[i][1] को pq में डालें
    • ret := ret और sum * v[i][0] का अधिकतम
  • ret % (10^9 + 7) लौटाएं

C++ कार्यान्वयन

#include <bits/stdc++.h>
using namespace std;

class Solution {
public:
    int maxPerformance(int n, vector<int>& s, vector<int>& e, int k) {
        long long int ret = 0;
        vector<vector<int>> v;
        for (int i = 0; i < n; i++) {
            v.push_back({ e[i], s[i] });
        }
        sort(v.rbegin(), v.rend());
        priority_queue<int, vector<int>, greater<int>> pq;
        long long int sum = 0;
        for (int i = 0; i < n; i++) {
            if (pq.size() == k) {
                sum -= pq.top();
                pq.pop();
            }
            sum += v[i][1];
            pq.push(v[i][1]);
            ret = max(ret, sum * v[i][0]);
        }
        return ret % (long long int)(1e9 + 7);
    }
};

int main() {
    Solution ob;
    vector<int> v = {1,5,8,2,10,3};
    vector<int> v1 = {9,7,2,5,4,3};
    cout << (ob.maxPerformance(6, v, v1, 2));
    return 0;
}

इनपुट

6, {1,5,8,2,10,3}, {9,7,2,5,4,3}, 2

आउटपुट

60
  1. C++ में जॉब शेड्यूलिंग में अधिकतम लाभ (Maximum Profit in Job Scheduling) C++ में जॉब शेड्यूलिंग में अधिकतम लाभ (Maximum Profit in Job Scheduling)

    समस्या विवरण n अलग-अलग कार्य दिए गए हैं। प्रत्येक कार्य startTime[i] से endTime[i] तक चलता है और profit[i] लाभ देता है। हमें ऐसे कार्यों का सबसेट चुनना है जिनके समय ओवरलैप न हों, ताकि कुल लाभ अधिकतम हो। यदि एक कार्य समय X पर समाप्त होता है, तो दूसरा कार्य समय X पर शुरू हो सकता है। उदाहरण इनपुट sta

  1. - C++ में मिन हीप में अधिकतम तत्व

    समस्या कथन एक मिनिमम हीप दिया गया है, उसमें अधिकतम तत्व ढूंढें। उदाहरण यदि इनपुट हीप है: तो अधिकतम तत्व 55 है। एल्गोरिदम मिनिमम हीप में पैरेंट नोड इसके चाइल्ड्रन से छोटा होगा। इसलिए हम निष्कर्ष निकाल सकते हैं कि एक नॉन-लीफ नोड अधिकतम नहीं हो सकता। लीफ नोड्स में अधिकतम तत्व खोजें। उदाहरण #incl

  1. - C++ में पेयर्स की अधिकतम लंबाई चेन

    पेयर्स की एक चेन दी गई है। प्रत्येक पेयर में दो इंटीजर हैं और पहला इंटीजर हमेशा छोटा होता है, और दूसरा बड़ा, यही नियम चेन निर्माण के लिए भी लागू होता है। एक पेयर (x, y) को पेयर (p, q) के बाद तभी जोड़ा जा सकता है जब q < x हो।इस समस्या को हल करने के लिए, सबसे पहले हमें दिए गए पेयर्स को पहले एलिमेंट