栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

力扣,做菜顺序

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

力扣,做菜顺序

        一个厨师收集了他 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;
    }
};

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976786.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号