题目
现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 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
方法一
思路:
每次取需要装满水的数量最大(及次大)的杯子,已装水杯子数量减一,直至所有杯子数量均为零。
如示例一:
第1次amount = [1,4,2],最大及次大数量的杯子是amount[1],amount[2](温水、热水)→amount = [1,3,1]
第2次amount = [1,3,1],最大及次大数量的杯子是amount[1],amount[0](温水、冷水)→amount = [0,2,1]
第3次amount = [0,2,1],最大及次大数量的杯子是amount[1],amount[2](温水、热水)→amount = [0,1,0]
第4次amount = [0,1,0],最大及次大数量的杯子是amount[1],无(温水)→amount = [0,0,0]
由此,最少需要 4 秒才能装满所有杯子。
代码:
class Solution {
public:
int fillCups(vector<int>& amount) {
int max,mid,sum;
sum=0;
while(amount[0]!=0 || amount[1]!=0 || amount[2]!=0){
if(amount[0]>amount[1]){
max=0;
mid=1;
if(amount[0]>amount[2]){
if(amount[2]>amount[1]) mid=2;
}else{
max=2;
mid=0;
}
}else{//amoumt[1]>amount[0]
max=1;
mid=0;
if(amount[1]>amount[2]){
if(amount[2]>amount[0]) mid=2;
}else{
max=2;
mid=1;
}
}
if(amount[max]>0){
amount[max]--;
sum++;
}
if(amount[mid]>0){
amount[mid]--;
}
}
return sum;
}
};
方法二
思路:贪心 + 分类讨论
作者:力扣官方题解
来源:力扣(LeetCode)
代码:
static int cmp(const void *pa, const void *pb) {
return *(int *)pa - *(int *)pb;
}
int fillCups(int* amount, int amountSize) {
qsort(amount, amountSize, sizeof(int), cmp);
if (amount[2] > amount[1] + amount[0]) {
return amount[2];
}
return (amount[0] + amount[1] + amount[2] + 1) / 2;
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/minimum-amount-of-time-to-fill-cups/solutions/2103691/zhuang-man-bei-zi-xu-yao-de-zui-duan-zon-c7y4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。