力扣,做菜顺序

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

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

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

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

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

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

代码如下: 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值