链接
https://leetcode-cn.com/problems/water-and-jug-problem/
耗时
解题:1 h+
题解:29 min
题意
有两个容量分别为 x升 和 y升 的水壶以及无限多的水。现有一下 3 种操作:
- 装满任意一个水壶
- 清空任意一个水壶
- 从一个水壶向另外一个水壶倒水,直到装满或者倒空
问能否只通过上述 3 中操作得到恰好 z升 的水,最后用以上水壶中的一或两个来盛放取得的 z升 水。
思路
模拟一下样例,再次读题,可以发现题目可以转化成如下问题:
“若
,当
成什么关系时,
一定有整数解?”
这个问题还是太抽象,多模拟几组数据,仔细观察可以发现:当 互质时,可以得到 之间的任意一个 ;而 不互质时, 只能得到 最大公约数的倍数。
详细说明:假设 是整数,当 互质时,通过调整系数 一定能得到 ,故而可以得到 之间的任意一个数。当 不互质时,通过调整系数 在范围内排除 外最小只能得到 。所以当 一定时,可以归结为 只能得到 的倍数(这其实是贝祖定理,孤陋寡闻了)。也就是说当 能整除 时, 一定有整数解。
然而还有一些特殊情况需要处理:
- 根据实际问题 一定装不下
- 一定正确
- 或 时,只能得到 或另一只水壶的容量的水。
AC代码
class Solution {
public:
bool canMeasureWater(int x, int y, int z) {
if(z > x+y) return false;
if(z == 0) return true;
if(x == 0 || y == 0) return z%max(x,y) == 0;
return z%__gcd(x,y) == 0;
}
};