Water and Jug Problem

1. 解析 

题目大意,给定两个容量分别为x和y的容器,判断这两个容器是否可以测量出需要的容量。这题的本质涉及到一个数学裴蜀定理,难啊~~只要涉及数学定理的都很难,虽然代码就几行

2. 分析

参考@Grandyang博主的思路,很到位。我这里重述一下,先将场景抽象成我们要求解的问题,相当于给定一个装满水的大容器(反正就是取不完),给你两个有容量的容器,看你能否利用这两个容器盛出我想要的容量。例如,题目中的例子x=3,y=5,z=4,即我们可以先用y容器盛满5升,然后倒进x容器当中,此时y容器还剩下2升,将x容器中的水倒回大容器(就是倒掉),然后将y容器中的剩余的2升水导入x容器,此时x容器中有2升水,y容器没有水,将y容器盛满,然后再往x容器倒入1升水,y容器装的水即为4升。用数学表达式可以表示成3*\left ( -2 \right )+5*2=4,负数代表倒掉,正数代表舀水。即相当于求解x*a+y*b=z是否有解,这考察的就是裴蜀定理,证明过程麻烦,我也不会~~~

根据定理有解的必要条件:当且仅当z 能整除 (x, y)的最大公因数。求解两个数的最大公因数我们一般采用辗转相除法,最后注意一点就是x+y的容量不能小于z,不然怎么盛出来

class Solution {
public:
    bool canMeasureWater(int x, int y, int z) {
        return z == 0 || ((x + y >= z) && (z % gcd(x, y) == 0));
    }
    int gcd(int x, int y){ //求解最大公因数
        return y == 0 ? x : gcd(y, x % y);
    }
};

 [1]https://www.cnblogs.com/grandyang/p/5628836.html

 [2]https://baike.sogou.com/v412864.htm;jsessionid=D361BD102070EBCE9036B715969D73DD

 [3]https://www.cnblogs.com/ECJTUACM-873284962/p/7130784.html 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值