[Leetcode] 365. Water and Jug Problem 解题报告

本文探讨了使用两个容量分别为x和y升的桶精确测量z升水的问题。通过数学方法和辗转相除法求最大公约数,给出了判断能否实现精确测量的充要条件,并提供了简洁的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

You are given two jugs with capacities x and y litres. There is an infinite amount of water supply available. You need to determine whether it is possible to measure exactly z litres using these two jugs.

If z liters of water is measurable, you must have z liters of water contained within one or both buckets by the end.

Operations allowed:

  • Fill any of the jugs completely with water.
  • Empty any of the jugs.
  • Pour water from one jug into another till the other jug is completely full or the first jug itself is empty.

Example 1: (From the famous "Die Hard" example)

Input: x = 3, y = 5, z = 4
Output: True

Example 2:

Input: x = 2, y = 6, z = 5
Output: False

思路

这是一道数学题目(不过顺便也考查了一下求最大公约数的辗转相除法^_^),具体解释在youtube上面可以看到: "Die Hard" example,我自己也没明白具体原理。不过总体来讲要用x升和y升大小的两个桶精确量出z升水,其充要条件是:1)z必须小于等于(x + y)(否则装不下);2)z必须可以除尽x和y的最大公约数。其中条件1)显而易见;但是条件2)是为什么呢?求解释。

代码

class Solution {
public:
    bool canMeasureWater(int x, int y, int z) {
        if(z > x + y) {
            return false;
        }
        return z == 0 ? true : z % gcd(x, y) == 0;
    }
private:
    int gcd(int x, int y) {  
        return y == 0 ? x : gcd(y, x % y);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值