• Leetcode 365 水壶问题 (扩展欧几里得)


    题目描述:

      有两个容量分别为 x升 和 y升 的水壶以及无限多的水。请判断能否通过使用这两个水壶,从而可以得到恰好 z升 的水?如果可以,最后请用以上水壶中的一或两个来盛放取得的 z升 水。

      你允许:

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

    题解:

      题目允许的三个操作,分别对应+x,+y,+(max(x,y)-min(x,y))。根据贝祖定理(扩展欧几里得)有ax+by=gcd(a,b)。也就是说,如果z为gcd(a,b)的倍数的话,就有解。

    由于题目还有一个限制--选择x,y两个水壶中的一个或者两个来盛水。使用x,y最多能够盛x+y升的水,加一个判断就好了。

    AC代码:

      

    class Solution {
    public:
        int gcd(int x,int y)
        {
            if(y == 0) return x;
            return gcd(y,x%y);
        }
        bool canMeasureWater(int x, int y, int z) {
            int g = gcd(x,y);
            if(x+y < z ) return false;
            if(x == 0 && y == 0)
            {
                if(z == 0 )return true;
                return false;
            }
            if(x == 0 ) g = y;
            if(y == 0) g = x;
            if(z%g == 0) return true;
    
            return false;
        }
    };
  • 相关阅读:
    指定pdf的格式
    iptables 防火墙
    jumpserver2
    jquery UI
    python 自动化审计
    Jumpserver
    认识二进制安全与漏洞攻防技术 (Windows平台)
    将这段美化的css代码
    pycharm
    android Tips
  • 原文地址:https://www.cnblogs.com/z1141000271/p/12603392.html
Copyright © 2020-2023  润新知