題目連結:
題目意譯:
你被給定兩整數 n 和 k 以及兩個長度為 n 的整數陣列 speed 和 efficiency 。現在有著 n 位工程師編號為 1 到 n 。speed[i] 和 efficiency[i] 依序代表著第 i 位工程師的速度以及效率。
從 n 個工程師中選出最多 k 位不同的工程師來組成一支隊伍,其有著最大的工作效能。
一個隊伍的工作效能為這些工程師的速度總和,乘上它們所有人之中的最低效率值。
回傳這個隊伍最大的工作效能之值。因為答案可能是一個很大的數字,因此將其模 10 ^ 9 + 7 後回傳。
限制:
1 ≦ k ≦ n ≦ 10 ^ 5
speed.length == n
efficiency.length == n
1 ≦ speed[i] ≦ 10 ^ 5
1 ≦ efficiency[i] ≦ 10 ^ 8
範例測資:
範例 1:
輸入: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 2
輸出: 60
解釋:
我們能得到隊伍最大工作效能,藉由選擇工程師 2 (有著速度 = 10 和效率 = 4)以及工程師 5(有著速度 = 5 和效率 = 7) 。也就是說,工作效能 = (10 + 5) × min(4, 7) = 60 。
範例 2:
輸入: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 3
輸出: 68
解釋:
此與第一個例子相同但 k = 3。我們可以選擇工程師 1 、工程師 2 、工程師 5 來得到隊伍的最大工作效能。也就是,工作效能 = (2 + 10 + 5) × min(5, 4, 7) = 68 。
範例 3:
輸入: n = 6, speed = [2,10,3,1,5,8], efficiency = [5,4,3,9,7,2], k = 4
輸出: 72
解題思維:
我們先將所有工程師按照他們的效率值由大排到小,並為此重新編號成新的 1 ~ n。因此我們可以看到每一位工程師 i ,都將是從最左側到他的位置(1 ~ i)所有工程師中效率值最低的人。
此時我們宣告一個優先佇列 P(Priority Queue)來儲存目前選定的工程師之速度值,而速度越小的越接近頂端(因此 P.top() 為最小值)。
接著我們依序掃過每位工程師。當遇到第 i 位工程師時,我們先判斷 P 的大小是否為 k 。如果是的話,我們需要先從中移除掉速度值最小的,即 P.top() 。然後再將第 i 位工程師的速度值推入 P 之中,代表我們現在要選擇他。
因此此時可以看到,此時的 P 之內容即代表著在要選擇第 i 位工程師的情況下所能安排的最佳隊伍(我們選擇了 1 ~ i - 1 之中速度最大的 k - 1 個人(如果足 k - 1 的話))。因此此隊伍的工作效能為 P 中所有速度值總和 × 第 i 位工程師之效率值(因為根據前面的排序,他將是這個隊伍效率最低的)。
如此一來,我們便知道了在必定選擇某位工程師的情況下,其隊伍所能得到的最大工作效能之值。
而在這所有工作效能之值中的最大值,即是整體的最大工作效能,即所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。