【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.length1 <= 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 897. 递增顺序查找树(Increasing Order Search Tree)
897. 递增顺序查找树 897. Increasing Order Search Tree 题目描述 给定一个树,按中序遍历重新排列树,使树中最左边的结点现在是树的根,并且每个结点没有左子结点,只有 ...
- LeetCode 刷题顺序表
Id Question Difficulty Frequency Data Structures Algorithms 1 Two Sum 2 5 array + set sort + two poi ...
- ACM金牌选手整理的【LeetCode刷题顺序】
算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...
- LeetCode 78,面试常用小技巧,通过二进制获得所有子集
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第47篇文章,我们一起来看下LeetCode的第78题Subsets(子集). 这题的官方难度是Medium,点赞 ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- C++之路进阶——bzoj2879(美食节)
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1304 Solved: 702[Submit][Status] ...
- 【BZOJ-2879】美食节 最小费用最大流 + 动态建图
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1366 Solved: 737[Submit][Status] ...
- BZOJ 2879: [Noi2012]美食节 最小费用流 动态添边
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 324 Solved: 179[Submit][Status] ...
- 2879: [Noi2012]美食节 - BZOJ
Description CZ市为了欢迎全国各地的同学,特地举办了一场盛大的美食节.作为一个喜欢尝鲜的美食客,小M自然不愿意错过这场盛宴.他很快就尝遍了美食节所有的美食.然而,尝鲜的欲望是难以满足的.尽 ...
随机推荐
- Linux 软件安装位置选择指南
Linux 软件安装 Linux 下安装软件不像 Windows 下安装这么简单,Windows 下会自动选择合适安装路径,而 Linux 下安装路径大部分完全由自己决定,我可以将软件安装到任意可 ...
- 汇编LED实验
汇编语言点亮LED 拿到一款全新的芯片,第一个要做的事情的就是驱动其 GPIO,控制其 GPIO 输出高低电平. GPIO口是IO口的一个功能之一. 一.接下来的步骤离不开芯片手册: 1.使能所有时钟 ...
- OpenStack——云平台部署
一.配置网络 准备:安装两台最小化的CentOS7.2的虚拟机,分别添加两张网卡,分别为仅主机模式和NAT模式,并且计算节点设置为4G运行内存,50G硬盘 1.控制节点--配置网络 控制节点第一个网卡 ...
- adjust, administer
adjust to just, exact. In measurement technology and metrology [度量衡学], calibration [校准] is the compa ...
- 【leetcode】208. Implement Trie (Prefix Tree 字典树)
A trie (pronounced as "try") or prefix tree is a tree data structure used to efficiently s ...
- jenkins之代码部署回滚脚本
#!/bin/bash DATE=`date +%Y-%m-%d_%H-%M-%S` METHOD=$1 BRANCH=$2 GROUP_LIST=$3 function IP_list(){ if ...
- maven管理本地jar包
maven作为包管理工具,好处不必多说.但是有些情况,比如需要引入第三方包,如快递鸟,支付宝,微信等jar包(当然有可能直接提供maven依赖),如果直接下载到本地之后,怎么整合到自己的maven工程 ...
- Redis哨兵 部署和配置
目录 一.哨兵简介 哨兵介绍 哨兵原理 二.哨兵部署 环境介绍 哨兵配置 三.使用验证 一.哨兵简介 哨兵介绍 Sentinel(哨兵)是用于监控redis集群中Master状态的工具,其已经被集成在 ...
- Jmeter——SMTP Sampler发送邮件
在平时测试过程中,也会出一些测试报告,那jmeter在不依托其他工具的情况下,可不可以发送邮件呢,自然是可以的. 我们直接使用SMTP Sampler即可. SMTP Sampler参数 我们来添加个 ...
- DIgSILENT PowerFactory 15.1.7 破解过程
将dll文件复制到安装路径下: