【Leetcode】水壶问题(每日一题)

题目链接:水壶问题


题意:有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?

如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

你允许:

装满任意一个水壶
清空任意一个水壶
从一个水壶向另外一个水壶倒水,直到装满或者倒空


题解:有一个定理叫做裴蜀定理。熟悉数论的应该都知道这个定理。

对任何整数 a、b和它们的最大公约数 d ,关于未知数 x 和 y 的线性丢番图方程。

有一个最著名的推论就是:ab互质的充要条件是存在整数x,y使得ax+by = 1

而这个题就是这个定理的运用。只要满足z%gcd(a,b) == 0即可。

(吐槽一下样例,给了0,0,0和1,0,0我不知道是个什么鬼。。脱离实际情况出数据可还行。)

还有一定要满足x+y >= z

扫描二维码关注公众号,回复: 10033967 查看本文章


代码:

 1 class Solution {
 2 public:
 3     int gcd(int a,int b){
 4         if(b == 0)  return a;
 5         return gcd(b,a%b);
 6     }
 7     bool canMeasureWater(int x, int y, int z) {
 8         if(x == 0)  return y == z;
 9         if(z == 0)  return true;
10         if(x+y < z) return false;
11 
12         int ans = gcd(x,y);
13 
14         if(z%ans)   return false;
15         else    return true;
16     }
17 };

猜你喜欢

转载自www.cnblogs.com/Asumi/p/12541952.html