力扣,做菜顺序

力扣,做菜顺序,第1张

        一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间。一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是 time[i]*satisfaction[i] 。

        请你返回做完所有菜 「喜爱时间」总和的最大值为多少。

        你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。

该题的解题思路为贪心算法

        我们将所有菜的满意程度从大到小排序;我们按照排好序的顺序依次遍历这些菜,对于当前遍历到的菜 i,如果它与之前选择的所有菜的满意程度之和大于 0,我们就选择这道菜,否则可以直接退出遍历的循环。这是因为如果i​与之前选择的所有菜的满意程度之和已经小于等于 0 了,那么后面的菜比i的满意程度还要小,就更不可能得到一个大于 0 的和了。

        因此,我们可以将所有的菜按照满意程度从大到小排序,随后依次遍历每一道菜。如果加入这道菜导致总喜爱时间增加,我们就可以选取这道菜,否则我们直接退出循环。因为我们需要连续地选取若干道菜,而当前这道菜会产生副收益,因此后面的菜都不需要考虑了。

代码如下: 

class Solution {
public:
    int maxSatisfaction(vector& satisfaction) {
        sort(satisfaction.begin(), satisfaction.end(), greater());
        int presum = 0, ans = 0;
        for (int si: satisfaction) {
            if (presum + si > 0) {
                presum += si;
                ans += presum;
            }
            else {
                break;
            }
        }
        return ans;
    }
};

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1498640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-25
下一篇 2022-06-25

发表评论

登录后才能评论

评论列表(0条)

保存