力扣-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

方法一

思路:

每次取需要装满水的数量最大(及次大)杯子,已装水杯子数量减一,直至所有杯子数量均为零。

如示例一:

第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;
    }
};

方法二

思路:贪心 + 分类讨论

作者:力扣官方题解

链接: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)

代码:

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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值