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

#2335. 装满杯子需要的最短总时长
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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 == 3
0 <= amount[i] <= 100

解题思路:

假设不同类型杯子的数量分别为 x, y 和 z,其中 x≤y≤z。

  • 如果 x+y≤z,那么每次装满 z 的时候,可以同时装满 x 或 y,因此总时长为 z。
  • 如果 x+y>z,令 t=x+y−z,因为 y−z≤0,所以 t=x+y−z≤x≤y。
    • 如果 t 为偶数,相应的 x+y+z 也为偶数,那么可以同时将 x 和 y 都装满 t/2,剩余的 x+y−t=z,可以同时装满,因此总时长为 t+z= (x+y−z)/2+z= (x+y+z)/2 。
    • 如果 t 为奇数,相应的 x+y+z 也为奇数,那么可以同时将 x 和 y 都装满 (t−1)/2,剩余的 x+y−(t−1)=z+1>z,因此总时长为 (t−1)/2+z+1= (x+y−z−1)/2+z+1= (x+y+z+1)/2 。

因此无论 t 为奇数还是偶数,总时长都为 ⌈ x + y + z 2 ⌉ \lceil\frac{x+y+z}{2}\rceil 2x+y+z

class Solution {
    public int fillCups(int[] amount) {
        Arrays.sort(amount);
        if(amount[0]+amount[1]<amount[2]){
            return amount[2];
        }
        return (amount[0]+amount[1]+amount[2]+1)/2;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值