引入
在本週的雙週賽中,有了這麼一道題🔗:
一個廚師收集了他 n 道菜的滿意程度 satisfaction ,這個廚師做出每道菜的時間都是 1 單位時間。
一道菜的 「喜愛時間」係數定義爲烹飪這道菜以及之前每道菜所花費的時間乘以這道菜的滿意程度,也就是 time[i]*satisfaction[i] 。
請你返回做完所有菜 「喜愛時間」總和的最大值爲多少。
你可以按 任意 順序安排做菜的順序,你也可以選擇放棄做某些菜來獲得更大的總和。
示例 1:
輸入:satisfaction = [-1,-8,0,5,-9]
輸出:14
解釋:去掉第二道和最後一道菜,最大的喜愛時間係數和爲。每道菜都需要花費 1 單位時間完成。
因爲烹飪的順序是不確定的,需要在負數值滿意度和更長的時間上做一個取捨,所以如果直接按照題目所給的思維來做的話,是不對的。
題解
本題需要倒着來,具體做法如圖:
- 是通過逆序(由大到小的順序)求值的,每次都需要一個sum來統計加入了新的滿意度的菜的這一個時間單位的滿意度。如果不懂就看代碼。
public class Solution {
public int maxSatisfaction(int[] satisfaction) {
int size=satisfaction.length;
Arrays.sort(satisfaction);
int ans=0;
int tmp=0;
for (int i=size-1;i>=0;i--){
tmp+=satisfaction[i];
if (tmp<0) break;
ans+=tmp;
}
return ans;
}
}
這樣,當如果這個時間單位下,滿意度小於零了,那麼總時間單位上如果加上了這個單位的滿意度,總體是會縮小的,所以就找出了最大滿意度了。
這個方法很巧妙的將時間遞增,轉化爲每個單位時間滿意度的累加。