写点什么

leetcode-2335. 装满杯子需要的最短总时长

作者:肥晨
  • 2023-04-19
    江苏
  • 本文字数:863 字

    阅读完需:约 3 分钟

先上题目:

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。


给你一个下标从 0 开始、长度为 3 的整数数组 amount ,其中 amount[0]、amount[1] 和 amount[2] 分别表示需要装满冷水、温水和热水的杯子数量。返回装满所有杯子所需的 最少 秒数。


示例 1:


输入:amount = [1,4,2]输出:4解释:下面给出一种方案:第 1 秒:装满一杯冷水和一杯温水。第 2 秒:装满一杯温水和一杯热水。第 3 秒:装满一杯温水和一杯热水。第 4 秒:装满一杯温水。可以证明最少需要 4 秒才能装满所有杯子。
复制代码


示例 2:


输入:amount = [5,4,4]输出:7解释:下面给出一种方案:第 1 秒:装满一杯冷水和一杯热水。第 2 秒:装满一杯冷水和一杯温水。第 3 秒:装满一杯冷水和一杯温水。第 4 秒:装满一杯温水和一杯热水。第 5 秒:装满一杯冷水和一杯热水。第 6 秒:装满一杯冷水和一杯温水。第 7 秒:装满一杯热水。示例 3:
输入:amount = [5,0,0]输出:5解释:每秒装满一杯冷水。
复制代码


提示:


amount.length == 30 <= amount[i] <= 100
复制代码

解决思路:

设 abc 按序列排如果 c>a+b 返回 c 如果 c<a+b 返回(a+b-c)/2+c 如果是小数 要进一

为什么 c>a+b 返回 c ?

c 是最大数量水杯,并且大于 a+b,那么最佳策略当然是 A 和 B 分别和 C 一起灌水,最后 C 剩余的部分再单独装。这种情况的答案就是 C。

为什么 c<a+b 返回(a+b-c)/2+c 如果是小数 要进一

如果相差的并没有这么大,要尽量保证 A 和 B 剩余的容积尽可能相同,这样的话,我们就可以在装满 C 之后,同时装 A 和 B 把 C 装满时装入 A 和 B 的水也是 C,A 和 B 剩余要装的水量是 A+B-C,尽量平均地分配在 A 和 B 两个杯子中,所以剩余的时间就是(A+B-C)/2 然后再加上原本 c 杯水的时间

代码

/** * @param {number[]} amount * @return {number} */var fillCups = function(amount) {function methodSort(a,b){    return a-b;}amount=amount.sort(methodSort)if(amount[0]+amount[1]<amount[2]){    return amount[2]}else{    return Math.ceil((amount[0]+amount[1]-amount[2])/2)+amount[2]}};
复制代码


发布于: 刚刚阅读数: 3
用户头像

肥晨

关注

还未添加个人签名 2021-04-15 加入

平台:InfoQ、阿里云、腾讯云、CSDN、掘金、博客园等平台创作者 领域:前端 公众号:农民工前端

评论

发布
暂无评论
leetcode-2335. 装满杯子需要的最短总时长_三周年征文_肥晨_InfoQ写作社区