<p>You are given two integers <code>n</code> and <code>k</code> and two integer arrays <code>speed</code> and <code>efficiency</code> both of length <code>n</code>. There are <code>n</code> engineers numbered from <code>1</code> to <code>n</code>. <code>speed[i]</code> and <code>efficiency[i]</code> represent the speed and efficiency of the <code>i<sup>th</sup></code> engineer respectively.</p>

<p>Choose <strong>at most</strong> <code>k</code> different engineers out of the <code>n</code> engineers to form a team with the maximum <strong>performance</strong>.</p>

<p>The performance of a team is the sum of its engineers&#39; speeds multiplied by the minimum efficiency among its engineers.</p>

<p>Return <em>the maximum performance of this team</em>. Since the answer can be a huge number, return it <strong>modulo</strong> <code>10<sup>9</sup> + 7</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
<strong>Output:</strong> 60
<strong>Explanation:</strong> 
We have the maximum performance of the team by selecting engineer 2 (with speed=10 and efficiency=4) and engineer 5 (with speed=5 and efficiency=7). That is, performance = (10 + 5) * min(4, 7) = 60.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
<strong>Output:</strong> 68
<strong>Explanation:
</strong>This is the same example as the first but k = 3. We can select engineer 1, engineer 2 and engineer 5 to get the maximum performance of the team. That is, performance = (2 + 10 + 5) * min(5, 4, 7) = 68.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
<strong>Output:</strong> 72
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= k &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>speed.length == n</code></li>
	<li><code>efficiency.length == n</code></li>
	<li><code>1 &lt;= speed[i] &lt;= 10<sup>5</sup></code></li>
	<li><code>1 &lt;= efficiency[i] &lt;= 10<sup>8</sup></code></li>
</ul>

// class Solution {
// public:
//     int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
//         vector<pair<int,int>> arr;
//         for(int i=0;i<n;i++){
//             arr.push_back(make_pair(efficiency[i],speed[i]);
//         }
//         sort(arr.begin(),arr.end(),myCompare);
        
//         priority_queue<int, vector<int>, greater<int>> speedHeap;
//         const int MOD = 1e9 + 7;
//         long long speedSum;
//         long long  eff;

//         for(auto i :arr){
//              int currEfficiency = i.first;
//             int currSpeed = i.second;
//         }

//     }
//     bool myCompare(pair<int,int>&a,pair<int,int>&a){
//         if(a.first == b.first) a.second>b.second;
//         return a.first>b.first;
//     }
// };


class Solution {
public:
    int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) {
        // Define modulo constant
        const int MOD = 1e9 + 7;

        // Create a vector of pairs of efficiency and speed
        vector<pair<int, int>> engineers;
        for (int i = 0; i < n; i++) {
            engineers.push_back({efficiency[i], speed[i]});
        }

        // Sort engineers by efficiency in descending order
        sort(engineers.rbegin(), engineers.rend());

        // Min-heap to keep track of the smallest speeds
        priority_queue<int, vector<int>, greater<int>> speedHeap;

        long long maxPerf = 0;
        long long speedSum = 0;

        // Iterate over the sorted engineers
        for (const auto& engineer : engineers) {
            int currEfficiency = engineer.first;
            int currSpeed = engineer.second;

            // Add current speed to the total speed sum
            speedSum += currSpeed;
            speedHeap.push(currSpeed);

            // If we have more than k engineers, remove the smallest speed
            if (speedHeap.size() > k) {
                speedSum -= speedHeap.top();
                speedHeap.pop();
            }

            // Calculate the performance with the current set of engineers
            maxPerf = max(maxPerf, speedSum * currEfficiency);
        }

        // Return the result modulo 1e9 + 7
        return maxPerf % MOD;
    }
};

43734