猴子吃香蕉过河问题分析与扩展

第一次接触这个题目是大学找工作时候的一次笔试,题干意思是说有一座桥长50m,桥的一端放着一堆香蕉总共100根,还有一只猴子,这只猴子想要过桥,但是每走1m就要吃一根香蕉(每移动1m要吃一根香蕉,否则饿死,就是这么矫情),并且猴子身上最多可以放50根香蕉,再多就被压死了。问:猴子最多可以把多少根香蕉搬到桥的另一端?

乍一看觉得不太科学,觉得猴子搬不过去,搬过去数量为0,仔细考虑,猴子是可以往返搬运的。

可以分为2个阶段:

1:第一阶段是往返搬香蕉,尽可能多的把香蕉往前挪动,假设猴子先搬50根香蕉走x米,这时候身上剩下50-x根,考虑回去路上吃的,还需要x根,所以可以在x米处丢掉香蕉50-2x根,然后返回,刚好走回去,再带50根,往前走,走到x米处又消耗x根,这时候需要一个条件,走到x米处要保证此时x米处所有香蕉数量不超过((50-x) + (50 - 2x) <= 50), 即(x >= 50 / 3)这样才能进入第二阶段,也就是带着所有的不超过50根的香蕉一口气走到桥尾。

2:第二阶段是把在x米处的香蕉数量一口气运送到桥尾,期间消耗香蕉数为50-x个,到桥尾的时候剩余数量可得为(50-x) + (50 - 2x)  - (50 - x)个,即 50 - 2x个,要让它最大,就得想最小,而x满足 x>= 50 / 3,x取17,最终结果50 - 2 * 17 = 16个。

不过这样有点无聊,像是纯数学不等式问题,可以加点难度变为编程问题,否则哪来的成就感,如果桥长为s米,初始香蕉总量为n根,猴子身上最多能放w根香蕉,每走1步就还是吃1根香蕉吧。

后续继续分析以及补上代码。

好几个月过去了,终于有机会继续分析这个问题,新问题同样分2个阶段:

1:相比原问题,第一阶段阶段进行分解,猴子每次走1米,每次都把剩余所有香蕉向前搬动1米,假设到到其中一个点,猴子把香蕉向前再搬1米,需要消耗香蕉数量为:2*(n / w)- 1,其中(n / w)代表需要搬的轮数,2轮要跑3次,3轮要跑5次....以此类推,有种情况是如果到倒数第二轮,如果后面还剩下1根香蕉,或者2根香蕉,则没有必要回去再搬,所以消耗香蕉数量为:2*(n % w < 2 ? n / w : n / w + 1)。这样递归下去到了剩余香蕉数量n'小于猴子负重能力w,则进行第二阶段。

2:第二阶段直接扛着剩余所有香蕉一口气走到头。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
scratch猴子香蕉代码是一种基于图形化编程语言的方式,让孩子们能够轻松理解和编写代码。下面是一个用scratch编写的猴子香蕉的简单代码: 首先,我们需要画出猴子香蕉,可以在scratch的绘画区域中使用相应的图形工具进行绘制。 接下来,我们需要设定猴子的初始位置,可以通过把猴子的x和y坐标设定为屏幕中央,使它出现在屏幕正中央。 然后,我们需要设置猴子的行动。我们可以使用一些控制块来实现猴子的行为。比如,使用“当猴子接触到香蕉时”这个事件块,让猴子能够察觉到香蕉的存在。 接下来,在该事件块中,我们可以添加一个“向前移动10步”的动作块,让猴子能够向前移动10个像素。这样,当猴子接触到香蕉时,它将向前移动一小步。 最后,我们还可以在猴子香蕉时,添加一个“播放音效”或者“跳舞”的动作块,以增加乐趣和互动性。 这样,我们的猴子香蕉代码就编写完成了。当我们点击“运行”按钮后,猴子将在屏幕上出现,并且向前移动,直到它接触到香蕉。接触到香蕉后,猴子会执行相应的动作,例如播放音效或跳舞,以增加用户的互动体验。 通过使用scratch猴子香蕉代码,孩子们可以通过简单的拖拉动作块的方式,实现一个有趣的互动场景,提高他们的创造力和逻辑思维能力。这也是scratch这一编程语言的主要目的之一,鼓励儿童学习和参与创作编程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值