c语言sscanf函数的用法是什么
284
2022-08-25
[leetcode] 365. Water and Jug Problem
Description
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
分析
题目的意思是:有两个容量分别为x和y升的水壶,用这两个水壶能否量出z升水。
杯子,容量分别为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); }};
参考文献
[LeetCode] Water and Jug Problem 水罐问题
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~