Leetcode1402.做菜顺序——逆序贪心

文章目录

  • 引入
  • 题解

引入

在本周的双周赛中,有了这么一道题:

一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。
一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。
请你返回做完所有菜 「喜爱时间」总和的最大值为多少。
你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。
示例 1:
输入:satisfaction = [-1,-8,0,5,-9]
输出:14
解释:去掉第二道和最后一道菜,最大的喜爱时间系数和为 ( − 1 ∗ 1 + 0 ∗ 2 + 5 ∗ 3 = 14 ) (-1*1 + 0*2 + 5*3 = 14) (11+02+53=14)。每道菜都需要花费 1 单位时间完成。

因为烹饪的顺序是不确定的,需要在负数值满意度和更长的时间上做一个取舍,所以如果直接按照题目所给的思维来做的话,是不对的。

题解

本题需要倒着来,具体做法如图:

  • 是通过逆序(由大到小的顺序)求值的,每次都需要一个sum来统计加入了新的满意度的菜的这一个时间单位的满意度。如果不懂就看代码。
    Leetcode1402.做菜顺序——逆序贪心_第1张图片
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;
    }
}

这样,当如果这个时间单位下,满意度小于零了,那么总时间单位上如果加上了这个单位的满意度,总体是会缩小的,所以就找出了最大满意度了。

这个方法很巧妙的将时间递增,转化为每个单位时间满意度的累加。

你可能感兴趣的:(LeetCode)