蚂蚁爬杆 java,蚂蚁爬杆-编程之美(转)

有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个

位置上各有一只蚂蚁。木杆很细,不能同时通过一只蚂蚁。开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退。当任意两只蚂蚁碰头

时,两只蚂蚁会同时调头朝反方向走。假设蚂蚁们每秒钟可以走一厘米的距离。编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间。

通过遍历查找,有32种可能的方向组合,但有16种"并列"为最慢.

==============================================

最快的摆放:

1.把木杆根据中点分为左半部分和右半部分。

2.作为一只蚂蚁,要想最快地离开木杆,首先是判断自己属于木杆的哪部分。如果是左,则向左走;如果是右,就向右走。这样就可最快地离开木杆。

最慢的摆放:

1.除非在中点,每只蚂蚁离开木杆都有一个近端距离, 远端距离

2.只要保证5只蚂蚁中 远端距离最长的蚂蚁面向远端, 其他的蚂蚁随便摆放即可。

所以在"32种可能的方向组合,有16种并列为最慢".

以题目为例

"有一根27厘米的细木杆,在第3厘米、7厘米、11厘米、17厘米、23厘米这五个位置上各有一只蚂蚁"

3cm 的(近端3,远端24)

7 (7,20)

11 (11,16)

17 (10,17)

23 (4,23)

所以只要保证3 厘米的蚂蚁面向24的一端 其他的蚂蚁随便摆。

把碰撞简化成AB相遇延a,b原方向继续前进,即可求出最大时间 就是最大的远端距离/速度。

此解法可以用于任意位置 任意速度,但必须保证每个蚂蚁速度相同。

==============================================

没有反例的啦, 哪怕有10000只蚂蚁在上面, 只要保证最远端的蚂蚁面向远端, 最长的时间就是最远端/速度。

这道题最大的迷惑项 是相撞, 如果转换成只是相遇,擦肩而过就好理解了,并且这种转化不影响结果。

假 设A B相向而行,A距远端的距离为a, B为b, A B各自走了距离c以后相遇,碰撞,反向, A要走(b-c)距离,

B要走(a-c), 总共A走了b, B走了a距离。所以max(a,b)就是最远距离,相撞还是擦肩而过只是影响到是A走了a还是走了b,

对整体答案没有影响。

应该可以有更缜密的数学推理,数学很差,就不献丑了。

这道题最大的迷惑项 是相撞, 如果转换成只是相遇,擦肩而过就好理解了。

这个题目有意思,看上去复杂,其实简单。如果蚂蚁转身不需要时间,而且所有的蚂蚁都长得一样,而且我眼神也不好的话,那么两只蚂蚁是碰撞还是擦肩而过,看上去都一样,反正我看到的先是两个黑点靠近,然后这两个黑点碰到一起,然后又分开。

“灵

魂算法”即是指当两只蚂蚁碰面后,理论上它们应该立即掉头反向而行,但此时我们可以认为它们是可以穿过对方的“灵魂”,碰面之后仍会坚持原来的方向行

走。(要知道,对我们来说题目中两只蚂蚁并没有什么不同之处,这是算法思想的关键,理解了这里我想接下来计算最大时间就不成问题了)。既然蚂蚁可以穿越对

方而行走,那么用时最长的就是行走路线最长的那只蚂蚁喽,回头看看情景中给出条件,即可得出结果:

第一只:27-3=24/1=24(s)

第二只:27-7=20/1=20(s)

第三只:27-11=16/1=16(s)

第四只:17-0=10/1=17(s)

第五只:23-0=23/1=23(s)

最长时间为24s

http://forum.byr.edu.cn/pc/pccon.php?id=1041&nid=72092

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值