蚂蚁爬杆问题

来源:互联网 发布:c语言多if 多else用法 编辑:程序博客网 时间:2024/04/27 18:28

今天QQ群里有人贴出一个这样的题目:

一根棍子上面有无数只蚂蚁,假设两只蚂蚁碰到之后就会180度调头反向前进,碰到,再调头,直到棍子的某一头,然后掉下来;然后再假设1只蚂蚁从棍子的这头到那头一共需要5分钟,那么问题是:需要多少时间,这根棍子上所有的蚂蚁会掉下来?

下面假设正方向蚂蚁为1,反方向蚂蚁为0

最短时间是毫无疑问的,000000....01....111111,这样蚂蚁会在2.5分钟全部掉落。

下面寻找最差解,如果中间的蚂蚁为杂乱无章的,比如101010101,因为有无穷多蚂蚁,那中间的蚂蚁势必要进行无限的转头运动。这显然是无意义的。

于是我们规定:蚂蚁转头时间为0,速度为匀速直线运动。

那么考虑如下情况:在111111111111中,突然有只nc蚂蚁是转向的,也就是111101111....那么在0左边的将会依次转头并转回,11101111->1101111->1011111->011111->然后0就掉下去了- -由于转头时间为0,这个过程是在一瞬间完成的。

如果有两只蚂蚁nc了,他们距离如果过远,就会变成两个如上过程。于是,两只蚂蚁无辜地从反方向掉落- -如果距离很近,例如111001111,容易分析得出结论:这个00就会不断左移,直到最左边的两只蚂蚁无辜地从反方向掉落- -

如果有很多蚂蚁nc了,这些nc蚂蚁会群起发动口水战来讨伐我,然后。。。好吧...我nc...

如此我们可以归纳得到:在一个10序列中,设1的个数为m,0的个数为n,则会有m只蚂蚁从正方向掉落,n只蚂蚁从反方向掉落。他们从不同方向掉落的唯一后果是缩短总掉落时间,当m=n时,掉落时间最短,为2.5分钟。

如此,解题完毕。

原创粉丝点击