【LeetCode】1402. 做菜顺序 Reducing Dishes
- 作者: 负雪明烛
- id: fuxuemingzhu
- 个人博客:http://fuxuemingzhu.cn/
目录
- 题目描述
- 题目大意
- 解题方法
- 贪心
- 日期
题目地址:https://leetcode-cn.com/problems/reducing-dishes/
题目描述
一个厨师收集了他 n 道菜的满意程度 satisfaction
,这个厨师做出每道菜的时间都是 1 单位时间。
一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前每道菜所花费的时间乘以这道菜的满意程度,也就是 time[i]*satisfaction[i]
。
请你返回做完所有菜 「喜爱时间」总和的最大值为多少。
你可以按 任意 顺序安排做菜的顺序,你也可以选择放弃做某些菜来获得更大的总和。
示例 1:
输入:satisfaction = [-1,-8,0,5,-9]
输出:14
解释:去掉第二道和最后一道菜,最大的喜爱时间系数和为 (-1*1 + 0*2 + 5*3 = 14) 。每道菜都需要花费 1 单位时间完成。
示例 2:
输入:satisfaction = [4,3,2]
输出:20
解释:按照原来顺序相反的时间做菜 (2*1 + 3*2 + 4*3 = 20)
示例 3:
输入:satisfaction = [-1,-4,-5]
输出:0
解释:大家都不喜欢这些菜,所以不做任何菜可以获得最大的喜爱时间系数。
示例 4:
输入:satisfaction = [-2,5,-1,0,3,-3]
输出:35
提示:
n == satisfaction.length
1 <= n <= 500
-10^3 <= satisfaction[i] <= 10^3
题目大意
合理安排做菜的顺序,让 等菜时间 * 满意度
的和最大
解题方法
贪心
这个题我想了动态规划等方法,但是没实现出来。其实需要一些技巧的。
首先的思路是:满意度越高的菜应该越在后面做,这样可以乘以等菜时间,实现喜爱时间最大化。
显然,我们需要对满意度进行排序。
这个题难就难在会有一些满意度是负数的菜,这些要不要上?从 示例 1 中我们看到如果添加上一个负数,能让后面的正数的满意度扩大,所以有可能会让负数添加到前面。
这个题的做法:
- 先把满意度进行排序
- 从满意度最大的开始,向满意度小的遍历。每次添加的一个新的满意度对应的等菜时间是 1, 而已经添加过的菜的喜爱时间需要再增加一次。
使用 before 保存前面已经添加过的所有菜的喜爱时间。使用 sum_time 保存现在为止添加了所有的菜的总的喜爱时间。
所以:
sum_time += before + satisfaction[i];
before += satisfaction[i];
最后找出 sum_time 的最大值即为所求。
C++代码如下。
class Solution {public:int maxSatisfaction(vector<int>& satisfaction) {const int N = satisfaction.size();sort(satisfaction.begin(), satisfaction.end());int res = 0;int sum_time = 0;int before = 0;for (int i = N - 1; i >= 0; --i) {sum_time += before + satisfaction[i];before += satisfaction[i];res = max(res, sum_time);}return res;}
};
欢迎关注负雪明烛的刷题博客,leetcode刷题800多,每道都讲解了详细写法!
日期
2020 年 4 月 5 日 —— 好久不打周赛了
【LeetCode】1402. 做菜顺序 Reducing Dishes相关推荐
- leetcode.1402做菜顺序
1402.做菜顺序 题目 分析 题目 一个厨师收集了他 n 道菜的满意程度 satisfaction ,这个厨师做出每道菜的时间都是 1 单位时间. 一道菜的 「喜爱时间」系数定义为烹饪这道菜以及之前 ...
- leetcode 1402. 做菜顺序【贪心】
从大到小排序 如 5 0 -1 -8 -9 1 2 1 3 2 1 4 3 2 1 5 4 3 2 1每次在之前的基础上把前i个累加和加一遍 然后加上第i个 遍历所有取最大即可 class Solut ...
- LeetCode —— 897. 递增顺序查找树(Python)
给你一个树,请你 按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点. 示例 : 来源:力扣(LeetCode) 链接:https://leetcode- ...
- leetcode 897. 递增顺序搜索树(中序遍历)
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点. 示例 1: 输入:root = [5,3,6,2 ...
- LeetCode 897. 递增顺序查找树(中序遍历)
1. 题目 给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有一个右子结点. 示例 :输入:[5,3,6,2,4,null,8,1,null,null,n ...
- 2022-4-8 Leetcode 1114.按顺序打印
原来直接用信号量就好了 #include <semaphore.h>class Foo {protected:sem_t firstJobDone;sem_t secondJobDone; ...
- LeetCode 897. 递增顺序搜索树
897. 递增顺序搜索树 [递归]比较捞,目前只想到了把所有节点保存一遍再更改左右指针的指向. class Solution {List<TreeNode> list = new Arra ...
- LeetCode 897 递增顺序搜索树
https://leetcode-cn.com/problems/increasing-order-search-tree/ 解决方案 Morris中序遍历 class Solution {publi ...
- leetcode 调整数组顺序使奇数位于偶数前面
解法一:双指针 public int[] Exchange(int[] nums) {int head = 0;int tail = nums.Length - 1;while(head < t ...
最新文章
- Hyperledger Composer评测
- 如何查询电脑的文件系统的分类是哪一种?
- 微型计算机常用的总线类型,常见总线有哪些类型
- 不是外链没用,而是你发的外链没用
- pythonexcel表格教程_python对excel表格的操作
- java –cp ./:_成为Java流专家–第2部分:中级操作
- 提高Java的锁性能
- 模拟组合键 postmessage ctrl+v_《模拟江湖》:TapTap热门榜单第一,测试版评分8.0的汉家松鼠工作室新作...
- 谁对EXTJS熟悉,有关关闭panel的问题?
- 5-1 可维护性的度量和构造原则
- 在数据中心里SDN技术发展现状
- Foursquare 8.0 :聪明人给互联网公司上的流量转化课
- python pickle文件大小_无法在Python中加载以前转储的大尺寸pickle文件
- 高项考试-信息化知识
- 进入微信公众平台自动跳转到小程序界面,而不是微信公众号界面。
- 动态规划-leetcode#213 打家劫环形舍
- 富文本编辑器ueditor 自定义工具栏配置
- 计算机中桌面中不显示U盘图标,电脑桌面右下角不能显示u盘图标解决方法
- UE5的项目建立及UE5(虚幻引擎5)个人视角移动按键操作及运行项目/day.2
- 电脑重装系统以后出现 error: unknown filesystem怎么办?