博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Water and Jug Problem 水罐问题
阅读量:6371 次
发布时间:2019-06-23

本文共 1554 字,大约阅读时间需要 5 分钟。

 

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 )

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

Example 2:

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

Credits:

Special thanks to for adding this problem and creating all test cases.

 

这是一道脑筋急转弯题,我想很多人以前应该听过这道题目,有一个容量为3升和一个容量为5升的水罐,问我们如何准确的称出4升的水。我想很多人都知道怎么做,先把5升水罐装满水,倒到3升水罐里,这时5升水罐里还有2升水,然后把3升水罐里的水都倒掉,把5升水罐中的2升水倒入3升水罐中,这时候把5升水罐解满,然后往此时有2升水的3升水罐里倒水,这样5升水罐倒出1升后还剩4升即为所求。这个很多人都知道,但是这道题随意给我们了三个参数,问有没有解法,这就比较难了。这里我就照搬吧:

这道问题其实可以转换为有一个很大的容器,我们有两个杯子,容量分别为x和y,问我们通过用两个杯子往里倒水,和往出舀水,问能不能使容器中的水刚好为z升。那么我们可以用一个公式来表达:

z = m * x + n * y

其中m,n为舀水和倒水的次数,正数表示往里舀水,负数表示往外倒水,那么题目中的例子可以写成: 4 = (-2) * 3 + 2 * 5,即3升的水罐往外倒了两次水,5升水罐往里舀了两次水。那么问题就变成了对于任意给定的x,y,z,存不存在m和n使得上面的等式成立。根据,ax + by = d的解为 d = gcd(x, y),那么我们只要只要z % d == 0,上面的等式就有解,所以问题就迎刃而解了,我们只要看z是不是x和y的最大公约数的倍数就行了,别忘了还有个限制条件x + y >= z,因为x和y不可能称出比它们之和还多的水,参见代码如下;

 

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

 

参考资料:

 

转载地址:http://fruqa.baihongyu.com/

你可能感兴趣的文章
我的友情链接
查看>>
我的友情链接
查看>>
视频应用方向的发展猜想
查看>>
GP数据库笔记--数据类型转换,杀掉进程的方法
查看>>
centos 文件扩展swap
查看>>
Leetcode#36Valid Sudoku
查看>>
军规3 关注多任务和意外情况处理
查看>>
分享:云上的日子——“0”费用消费全球最快手机传输工具
查看>>
Winform 不同窗体间方法调用总结
查看>>
新云东方Power System服务器首亮相 可信高端计算系统产业链雏形初具
查看>>
centos下搭建docker私有仓库
查看>>
静态路由配置过程
查看>>
软件开发模式对比(瀑布、迭代、螺旋、敏捷)
查看>>
windows域控制器恢复
查看>>
awk多分隔符
查看>>
start to use spirent
查看>>
搭建linux ris服务器批量在dell服务器上安装windows 2003
查看>>
无锡云计算大胆借鉴苹果模式 应用落地指日可待(转)
查看>>
linux下xargs命令用法
查看>>
使用mysql批量替换缩略图
查看>>