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
肯定一次充2是更优的,我们尽可能多的充2,这样只需要总和一半的次数就能完成。
假设不同类型杯子的数量分别为 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一共剩x+y-t=z杯,x和y分别和z同时装满,次数为(x+y-z)/2 + z = (x+y+z)/ 2
- 如果t是奇数,x+y+z 也为奇数,x,y同时装满(t-1)/ 2,(因为t是奇数,所以不能装满t/2,而如果等于t,则会增多z的单独装满次数),x+y一共剩x+y-t+1=z+1 > z,x,y分别和z装满,剩一杯x或y,次数为(x+y-z -1)/2 + z + 1 = (x+y+z + 1)/ 2。((x+y+z)/ 2向上取整)
-
因此无论 ttt 为奇数还是偶数,总时长都为 ⌈x+y+z⌉/2
coding
public int fillCups(int[] amount) {
Arrays.sort(amount);
if (amount[2] > amount[1] + amount[0]) {
return amount[2];
}
//向上取整
return (amount[0] + amount[1] + amount[2] + 1) / 2;
}
向上取整的三种方法
Java两整数相除向上取整_明月几时有666的博客-CSDN博客_java向上取整