java 水杯问题_每天一道算法题-一行代码解决两个水杯分水问题

1f5662b83dce633d56056888ebbe2b42.png

问题描述

有两个水杯,容量分别为x升和y升。水不限量。问能否用这两个杯子分出z升水。注意,没有其他容器,分完后,这z升水必须还在这两个杯子中。

可进行以下操作:

· 把任意一个杯子装满水

· 把任意一个杯子中的水全部倒出

· 把杯子1的水倒入杯子2中,直到杯子1装满,或杯子1清空

栗子

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

Output: True

先把y装满,然后用y把x装满,此时x=3,y=2;

清空x,把y的2倒入x,此时x=2,y=0;

再装满y,再用y装满x,此时x=3,y=4,拿到答案Bingo!

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

Output: False

捣鼓不出5升水,sad...

思路

这道题其实是一道数学题,虽然据说微软的面试考过这道题。

数论中,有一个裴蜀定理( Bézout's identity),说明了对任何整数x、y和它们的最大公约数d,一定存在整数a,b,使ax+by=d成立。

因此,只要满足z是GCD(x, y)的倍数,即可捣鼓出z升水。GCD(x, y)代表x,y的最大公约数。

所以,一行代码搞定!

C++代码

其中__gcd()是C++内置函数。

197a9bdbce40eb7e0e1484a35ededb53.png

参考资料:

Leetcode 第365题, https://leetcode.com/problems/water-and-jug-problem/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
青蛙跳杯子是蓝桥杯历届试中的一道典型目。目要求模拟一个青蛙跳杯子的游戏,给定n个杯子和m次操作,每次操作可以选择一个杯子,并将其放置在当前位置前面或者后面的位置。最后,要求输出经过m次操作后,杯子从左到右的顺序。 下面是一个可能的Java代码实现: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); // 杯子的数量 int m = scanner.nextInt(); // 操作的次数 int[] cups = new int[n]; // 初始化杯子的初始顺序 for (int i = 0; i < n; i++) { cups[i] = i+1; } // 执行m次操作 for (int i = 0; i < m; i++) { int index = scanner.nextInt(); // 选择的杯子的位置 int direction = scanner.nextInt(); // 移动的方向,1表示前面,2表示后面 // 将选择的杯子移动到指定位置 if (direction == 1) { for (int j = index-1; j > 0; j--) { int temp = cups[j]; cups[j] = cups[j-1]; cups[j-1] = temp; } } else if (direction == 2) { for (int j = index-1; j < n-1; j++) { int temp = cups[j]; cups[j] = cups[j+1]; cups[j+1] = temp; } } } // 输出最终的杯子顺序 for (int i = 0; i < n; i++) { System.out.print(cups[i] + " "); } } } ``` 该代码首先读取输入的杯子数量n和操作次数m,然后创建一个数组用来保存杯子的顺序。从1到n依次填充数组的初始顺序。接下来,执行m次操作,根据输入的位置和方向调整杯子的顺序,最后输出调整后的杯子顺序。 需要注意的是,该代码没有进行输入合法性的验证,实际应用中可能需要对输入进行适当的验证和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值