leetcode每日一题:酿造药水需要的最少总时间
引言
今天的每日一题原题是2255. 统计是给定字符串前缀的字符串数目,直接模拟,逐个匹配words中的字符串是否是s的前缀即可。更换成前几天遇到的更有意思的一题来写这个每日一题。
题目
给你两个长度分别为 n
和 m
的整数数组 skill
和 mana
。
在一个实验室里,有 n
个巫师,他们必须按顺序酿造 m
个药水。每个药水的法力值为 mana[j]
,并且每个药水 必须 依次通过 所有 巫师处理,才能完成酿造。第 i
个巫师在第 j
个药水上处理需要的时间为 timeij = skill[i] * mana[j]
。
由于酿造过程非常精细,药水在当前巫师完成工作后 必须 立即传递给下一个巫师并开始处理。这意味着时间必须保持 同步,确保每个巫师在药水到达时 马上 开始工作。
返回酿造所有药水所需的 最短 总时间。
示例 1:
输入: skill = [1,5,2,4], mana = [5,1,4,2]
输出: 110
解释:
药水编号 | 开始时间 | 巫师 0 完成时间 | 巫师 1 完成时间 | 巫师 2 完成时间 | 巫师 3 完成时间 |
---|---|---|---|---|---|
0 | 0 | 5 | 30 | 40 | 60 |
1 | 52 | 53 | 58 | 60 | 64 |
2 | 54 | 58 | 78 | 86 | 102 |
3 | 86 | 88 | 98 | 102 | 110 |
举个例子,为什么巫师 0 不能在时间 t = 52
前开始处理第 1 个药水,假设巫师们在时间 t = 50
开始准备第 1 个药水。时间 t = 58
时,巫师 2 已经完成了第 1 个药水的处理,但巫师 3 直到时间 t = 60
仍在处理第 0 个药水,无法马上开始处理第 1个药水。
示例 2:
输入: skill = [1,1,1], mana = [1,1,1]
输出: 5
解释:
- 第 0 个药水的准备从时间
t = 0
开始,并在时间t = 3
完成。 - 第 1 个药水的准备从时间
t = 1
开始,并在时间t = 4
完成。 - 第 2 个药水的准备从时间
t = 2
开始,并在时间t = 5
完成。
示例 3:
输入: skill = [1,2,3,4], mana = [1,2]
输出: 21
提示:
n == skill.length
m == mana.length
1 <= n, m <= 5000
1 <= mana[i], skill[i] <= 5000
思路
首先要读懂题目,有个关键点是,对于同一瓶药水,在前一个巫师处理完成后,立即传递给下一个巫师进行处理。所以,这里跟直觉的贪心有一些区别,对于同一个巫师,处理一瓶药水后,并不能马上去处理下一瓶药水,要确保自己处理完成后,后一个巫师是空闲的状态。
读懂了这个点,我们来看第i瓶药水的处理,假设我们记第i瓶药水是从第beginDelay
的时刻开始处理,而每个巫师处理上一瓶(第i-1
瓶)药水的完成时间为end[],我们来看看这个beginDelay
需要满足哪些条件:
- 对于第0个巫师,自己的开始处理时间是
beginDelay
,必须晚于等于上一瓶结束时间,保证开始处理第i瓶是,自己是空闲的,即满足beginDelay >= end[0]
; - 对于第1个巫师,自己的开始处理时间是
beginDelay + skill[i] * mana[0]
,必须晚于等于上一瓶结束时间,即满足beginDelay + skill[i] * mana[0] >= end[1]
; - 对于第2个巫师,自己的开始处理时间是
beginDelay + skill[i] * (mana[0] + mana[1])
,必须晚于等于上一瓶结束时间,即满足beginDelay + skill[i] * (mana[0] + mana[1]) >= end[1]
; - 后面的巫师可以以此类推
这样,如果我们有n个巫师,对于第i瓶药水,就会有n个不等式,贪心的,求出满足这n个不等式的最小beginDelay
,就可以求出对于第i瓶药水每个巫师的最早完成时间,用于列出第i+1瓶要求的不等式。特别的,对于第0瓶药水,当前每个巫师都是空闲的,可以认为end[]
数组的值都是0。
另外,不等式中,我们对每瓶要求都会去求出mana[0]
、mana[0] + mana[1]
、mana[0] + mana[1] + mana[2]
这样的值,可以事先求一次前缀和,避免重复计算。
图解
代码
public long minTime(int[] skill, int[] mana) {
int n = skill.length;
int[] skillPreSum = new int[n + 1];
for (int i = 0; i < n; i++) {
skillPreSum[i + 1] = skillPreSum[i] + skill[i];
}
long[] end = new long[n];
for (int i = 0; i < mana.length; i++) {
long beginDelay = 0;
for (int j = 0; j < n; j++) {
beginDelay = Long.max(beginDelay, end[j] - (long)mana[i] * skillPreSum[j]);
}
for (int j = 0; j < n; j++) {
end[j] = beginDelay + (long)mana[i] * skillPreSum[j+1];
}
}
return end[n - 1];
}
耗时
leetcode每日一题:酿造药水需要的最少总时间的更多相关文章
- 【js】Leetcode每日一题-制作m束花所需的最少天数
[js]Leetcode每日一题-制作m束花所需的最少天数 [题目描述] 给你一个整数数组 bloomDay,以及两个整数 m 和 k . 现需要制作 m 束花.制作花束时,需要使用花园中 相邻的 k ...
- 【JavaScript】Leetcode每日一题-在D天内送包裹的能力
[JavaScript]Leetcode每日一题-在D天内送包裹的能力 [题目描述] 传送带上的包裹必须在 D 天内从一个港口运送到另一个港口. 传送带上的第 i 个包裹的重量为 weights[i] ...
- 【js】Leetcode每日一题-完成所有工作的最短时间
[js]Leetcode每日一题-完成所有工作的最短时间 [题目描述] 给你一个整数数组 jobs ,其中 jobs[i] 是完成第 i 项工作要花费的时间. 请你将这些工作分配给 k 位工人.所有工 ...
- 【js】Leetcode每日一题-数组异或操作
[js]Leetcode每日一题-数组异或操作 [题目描述] 给你两个整数,n 和 start . 数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == ...
- 【js】Leetcode每日一题-解码异或后数组
[js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...
- 【JavaScript】Leetcode每日一题-青蛙过河
[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...
- 【JavaScript】Leetcode每日一题-平方数之和
[JavaScript]Leetcode每日一题-平方数之和 [题目描述] 给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c . 示例1: 输入:c = 5 ...
- 【JavaScript】Leetcode每日一题-二叉搜索树的范围和
[JavaScript]Leetcode每日一题-二叉搜索树的范围和 [题目描述] 给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和. 示例1: 输入: ...
- 【JavaScript】Leetcode每日一题-递增顺序搜索树
[JavaScript]Leetcode每日一题-递增顺序搜索树 [题目描述] 给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没 ...
- 【python】Leetcode每日一题-寻找旋转排序数组中的最小元素
[python]Leetcode每日一题-寻找旋转排序数组中的最小元素 [题目描述] 已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组.例如,原数组nums ...
随机推荐
- MPC收藏
收集有关MPC的优秀文章,方便查阅. 同态加密 原理 介绍 程序员的干货!核心理论之同态加密 https://mp.weixin.qq.com/s/1uH0UjnS_Mo8ShXJ-16UXw BGV ...
- 使用pkg对nodejs项目打包
pkg的介绍可以阅读官方说明.下面针对使用做一个简单的说明. 1. 安装, 假设需要将项目打包成 win-x86 下运行的软件包,需要确定使用的 pkg 和 pkg-fecth 的版本,目前最后一个 ...
- linux mint安装eclipse
安装eclipse之前需要先安装配置jdk,参考上面, 一.Eclipse的下载与安装 1.首先,在Eclipse的官网中下载最新版的Luna SR2http://www.eclipse.org/do ...
- windows配置maven
1.下载mavenhttps://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/ 中找到相应的版本2.解压3.配置环境变量MAVEN_HOMED: ...
- centos 8 mysql 更改数据存储位置
登录mysql后,先切换到myql数据库下通过show global variables like '%datadir%'; 可以查看数据默认的存储路径(一般在 /var/lib/mysql) 新建数 ...
- kvm实验环境的准备
在虚拟机上最小化安装centos7,看一下我的版本 [root@kvm1 yum.repos.d]# cat /etc/redhat-release CentOS Linux release 7.9. ...
- vue+elementui怎样点击table中的单元格触发事件--弹框
可以先看一下官网中table的自定义列模板代码 <template> <el-table :data="tableData" border s ...
- JavaGUI - [04] BoxLayout
题记部分 一.简介 为了简化开发,Swing引入了一个新的布局管理器:BoxLayout.BoxLayout可以在垂直和水平两个方向上摆放GUI组件,BoxLayout提供了如下一个简单的构造器: ...
- Flink - [01] 概述
官网:https://flink.apache.org/ 一.Flink 是什么 是一个流式的数据流执行引擎,其针对数据流的分布式计算提供了数据分布,数据通信以及容错机制等功能. 是一个框架和分布式处 ...
- 机器学习 | 强化学习(4) | 无模型控制(Model-Free Control)
无模型控制(Model-Free Control) 无模型预测概论 上一节课: 无模型预测 用于估计一个未知马尔科夫决策过程的价值函数 这节课 无模型控制 最优化一个未知马尔科夫决策过程的价值函数 一 ...