其实这篇文章是今年上半年,也就是博主高一下的某个晚自习写的,写在了纸上
今天整理书房的时候翻出来了,顺便就同步到博客上吧

原题概况

有一个3L容量的桶和一个5L容量的桶
同时还有一个无限出水的水龙头
如何精确地量出4L的水?

emmm…

当时我第一眼看到这个题目时,心想“这不是小学题目吗?还面试题?搞笑呢?看我分分钟解决它!”
但是,我承认,我大意了。
做完作业后又想起这道题,便直接翻开了答案。

卧槽!怎么这么简单!

答案

方法一

  1. 5L桶接满水
  2. 5L桶往3L桶里面倒水,此时3L桶装有3L水,5L桶还有2L水
  3. 3L桶的水倒掉
  4. 5L桶的2L水倒进3L桶,此时3L桶装有2L水,5L桶没有水
  5. 5L桶再接满水
  6. 5L桶往3L桶里面倒水,此时3L桶装有3L水,5L桶还有4L水
  7. 结束

方法二

  1. 3L桶接满水
  2. 3L桶的水全部倒入5L桶
  3. 3L桶接满水
  4. 3L桶的水再倒入5L桶,此时3L桶还有1L水,5L桶有5L水
  5. 5L桶的水全部倒掉
  6. 3L桶的水全部倒入5L桶
  7. 3L桶接满水
  8. 3L桶的水全部倒入5L桶
  9. 结束

感想

看完这个答案,一拍脑子,卧槽这么简单的吗?
但是确实不容易想到
一开始就想歪了,脑子中具象出了两个桶,不自觉的就开始往物理角度开始考虑
但其实这只是一道简单数学题。。。。。。

思考

看完解答之后,我开始思考。
如果是给定两个任意正整数容量的桶,能否计算出精确测量它们容积中位数容量的水至少需要几步?

为什么一定是它们的中位数呢?

首先,为什么不能是平均数?

  1. 第一,平均数那么就只能是两个桶的容积同时为奇数或者同时为偶数,不然会有小数点,而一旦有小数点那么题目所给出的方法是行不通的
  2. 第二,两个桶的容积同时为偶数时,那么最少操作就是较大数除以较小数,没有必要
  3. 第三,两个桶的容积同时为奇数时,那么两者的平均数就是它们的中位数/doge

其次,为什么不能是两数之和?

因为我们只有两个桶,两数之和的水是没地方装的

最后,为什么不能是两数之差?

没说不行啊,这个可以留作课后作业😂

经过推理和证明,最终写下了这样的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
def solve(a, b):
w, i, c = 2 * a - b, 3, True
if b - a == (a + b) / 2 or b == a * 3:
i = int((a + b) / 2 / a)
c = False
if (a % 2 == 0 or b % 2 == 0) and c == True:
print("It's impossible!")
return
while c:
while w + a < b:
w += a
i += 1
if w == (a + b) / 2:
c = False
break
w += a - b
if c: i += 2
if ((a + b) / 2) % a == 0 and ((a + b) / 2) < i:
i = int(((a + b) / 2) / a)
print("It takes " + str(i) + " times at least.")
return

solve(3, 5) # 测试

当然,这个代码最后得出的次数仅包含以下操作:

  1. 两桶之间倒水
  2. 一个桶接满水

鸣谢

感谢冯子豪同学友情提供的题目