Java解决装满杯子需要的最短总时长

Java解决装满杯子需要的最短总时长

01 题目

现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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

02 知识点

  • 数学知识
  • 排序

03 我的题解

public class tanxi02 {

	public static void main(String[] args) {
//		测试数据
		int[] amount = {5,4,4};
		System.out.println(fillCups(amount));
	}
	public static int fillCups(int[] amount) {
//		先找到数组最大数
		Arrays.sort(amount);
//		如果数组最大数大于另外两数之和,则两两配对后,单独部分加上配队部分的和为数组最大数
//		如果数组最大数小于另外两数之和,分两种情况讨论
//		两数之和减去数组最大值为偶数,则两两配对后加单独部分为偶数的一半(amount[0]+amount[1]-amount[2])/2
//		两数之和减去数组最大值为奇数,则两两配对后加单独部分为奇数加1的一半(amount[0]+amount[1]-amount[2]+1)/2
//		因为当奇数除二时程序值会舍去0.5,故返回值为amount[0]+amount[1]-amount[2]+1
		if (amount[2]>amount[0]+amount[1]) {
			return amount[2];
		}else {
			return amount[2]+(amount[0]+amount[1]-amount[2]+1)/2;
		}
    }
}

你可能感兴趣的:(蓝桥杯,java,算法,开发语言)