# [LeetCode 1383. Maximum Performance of a Team ](https://leetcode.com/explore/challenge/card/june-leetcoding-challenge-2021/603/week-1-june-1st-june-7th/3768/) ### Daily challenge Jun 5, 2021 (HARD) :::success [相似題 : 857. Minimum Cost to Hire K Workers](https://hackmd.io/TsqkcrqrS2-tIhEQXIYM0A) ::: >You are given two integers **`n`** and **`k`** and two integer arrays **`speed`** and **`efficiency`** both of length n. There are **`n engineers`** numbered from 1 to n. **`speed[i]`** and **`efficiency[i]`** represent the speed and efficiency of the ith engineer respectively. > >Choose **`at most k`** different engineers out of the **`n`** engineers to form a team with the maximum **`performance`**. > >The performance of a team is the sum of their engineers' speeds multiplied by the minimum efficiency among their engineers. > >Return the maximum performance of this team. Since the answer can be a huge number, return it **modulo** 10^9^ + 7. :::info **Example 1:** **Input:** n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2 **Output:** 60 **Explanation:** 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. ::: :::info **Example 2:** **Input:** n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3 **Output:** 68 **Explanation:** 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. ::: :::info **Example 3:** **Input:** n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4 **Output:** 72 ::: :::warning **Constraints:** * 1 <= k <= n <= 105 * speed.length == n * efficiency.length == n * 1 <= speed[i] <= 105 * 1 <= efficiency[i] <= 108 ::: --- ### Approach 1 : Min Heap ( Priority Queue ) :book: **`80 ms ( 77.75% )`** **`O()`** * 將 `speed & efficiency` 存入 **`pair`** 中,並將 `efficiency` 的部分`由大到小`進行 **`sort`**。 * **`SumOfSpeed`** 紀錄當前 `speed` 總和, **`ans`** 紀錄當前最大答案。 * 目標找出最大的 **`performance = SumOfSpeed * efficiency[i]`** ( 因為 `sort` 後, `efficiency[i] <= efficiency[i-1]`,所以計算時只需考慮 `SumOfSpeed` 以及 `efficiency[i]` )。 * **`min_heap`** 紀錄目前使用的 `speed`, >* 每次都將 `speed[i]` 放入 `heap` 中,**`SumOfSpeed += speed[i]`**。 >* 當 `size > k` 時,**`SumOfSpeed -= heap.top()`**,並 `pop top of the value`。 >* 判斷最大值 **`ans = max(ans, performance = SumOfSpeed * efficiency[i])`**。 --- >**EXAMPLE :** >**`speed = [2, 10, 3, 1, 5, 8]`、`efficiency = [5, 4, 3, 9, 7, 2]`、`k = 2`**。 > 1. **sort efficiency** : > ---> `s = [1, 5, 2, 10, 3, 8]`。 > ---> `e = [9, 7, 5, 4, 3, 2]`。 > 2. **Min Heap** : > **`SumOfSpeed = 0`**、**`ans = 0`**。 >> * i = 0 ---> heap = `({1, 9})`。 >> **`SumOfSpeed = 1`**、**`performance = 1 * 9 = 9`**、**`ans = 9`** :+1: 。 >> * i = 1 ---> heap = `({1, 9}, {5, 7})`。 >> **`SumOfSpeed = 6`**、**`performance = 6 * 7 = 42`**、**`ans = 42`** :+1: 。 >> * i = 2 ---> heap = `({2, 5}, {5, 7})`。 >> **`SumOfSpeed = 7`**、**`performance = 7 * 5 = 35`**、**`ans = 42`** :-1:。 >> * i = 3 ---> heap = `({10, 4}, {5, 7})`。 >> **`SumOfSpeed = 15`**、**`performance = 15 * 4 = 60`**、**`ans = 60`** :+1:。 >> * i = 4 ---> heap = `({10, 4}, {5, 7})`。 ( `{3, 3}` is impossible to be a good answer, becuase its `speed & efficiency` are both small。) >> * i = 5 ---> heap = `({10, 4}, {8, 2})`。 >> **`SumOfSpeed = 18`**、**`performance = 18 * 2 = 36`**、**`ans = 60`** :-1:。 ```cpp=1 class Solution { public: #define MOD 1000000007 static bool cmp(pair<int, int> a, pair<int, int> b){ return a.second > b.second; } int maxPerformance(int n, vector<int>& speed, vector<int>& efficiency, int k) { vector<pair<int, int> > people; priority_queue<int, vector<int>, greater<int> > heap; // stroe speed for(int i=0; i<n; i++){ people.push_back({speed[i], efficiency[i]}); } sort(people.begin(), people.end(), cmp); // sort by efficiency long long int SumOfSpeed = 0; long long int ans = 0; for(int i=0; i<n; i++){ heap.push(people[i].first); SumOfSpeed += people[i].first; if(heap.size() > k){ SumOfSpeed -= heap.top(); heap.pop(); } ans = max(ans, SumOfSpeed * people[i].second); } return ans % MOD; } }; ```