蚂蚁爬杆
来源:互联网 发布:淘宝好评文案 编辑:程序博客网 时间:2024/06/10 23:16
http://lam8da.sinaapp.com/?p=11
《编程之美》4.7节描述了蚂蚁爬杆问题,把所有具体数字都表示成字母后变为形如如下形式的问题:
有一根长为
该问题是经典问题了,有
- 第
i 只蚂蚁什么时候走出木杆? - 所有蚂蚁从一开始到全部离开木杆共碰撞了多少次?
- 第
k 次碰撞发生在哪个时刻?哪个位置?哪两个蚂蚁之间? - 哪只蚂蚁的碰撞次数最多?
- 如果不是一根木杆而是一个铁圈,经过一段时间后所有蚂蚁都会回到的状态吗?这个时间的上界是多少?
扩展1的解答
现在来解决扩展1。这个解答甚是精妙,通俗点来说,我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头。这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然可能已经不是它刚开始时背的那一袋了)。于是,我们可以求出每袋粮食离开木杆的时间(因为粮食是不会调头的)。又由于每袋粮食离开木杆的时间都对应某只蚂蚁离开木杆的时间,这是一种一一映射关系。现在我们要找到对应于第
若一开始时有
这个命题很容易证明:每次碰撞均不改变向左和向右的蚂蚁数量。于是,由于每次碰撞蚂蚁都会调头而不是穿过,最后必定是前
扩展2的解答
对于扩展2,我们只需求得每个蚂蚁的碰撞次数,然后累加即可。在这里我们换一种思路,把碰撞调头看成不调头而继续向前(穿过),则容易看出原问题(碰撞次数)就变为求穿过的次数(因为速度大小不变,原来的每次碰撞都对应于现在的一次穿过)。则对于每只向左的蚂蚁,它只会“穿过”那些在它左边的向右走的蚂蚁。因此,每只蚂蚁“穿过”的蚂蚁次数等于刚开始时在它前进方向上与它前进方向相反的蚂蚁个数。时间复杂度也是
扩展3的解答
第3个扩展问题有点复杂。首先我们假设
找到最小的时间
由于现在所有碰撞(易主)的时刻都是整点,故我们可以二分
在上一段中,要想使用线性时间复杂度求出易主时刻小于或等于
求出时刻的同时我们也求出了位置,故第二小问也解决。接下来要求哪两个蚂蚁发生了这次碰撞(如果同时存在多个碰撞求出任意一个即可)。其实,我们只需要求出每袋粮食在
扩展4的解答
对于第4个扩展,只要求出每只蚂蚁的碰撞次数即可。这也解决了扩展2的解答中原始思路。首先由扩展1的解答我们可以知道每只蚂蚁最终是往左还是右掉下去,然后假设第
扩展5的解答
这个问题看起来挺复杂,其实很简单。假设环长为
除了以上几个扩展,还有一些个人认为比较变态的扩展,有的没空仔细想,有的暂时没想到解法,也列出如下,欢迎拍砖:
- 如果每只蚂蚁的速度不一样(这就有可能由于追赶而产生碰撞,此时根据动量守恒定律:(,速度互换),上述扩展问题的答案是什么呢?
- 如果蚂蚁在一个平面上运动,同样也是碰头后原路返回(注意这不等同于两只蚂蚁交换继续前进),问是否所有蚂蚁都能最终离开平面?
- 在上述情况下,如果最终能离开平面,离开平面需要多长时间?
- 在上述情况下,回答关于一维的前文讨论的每个问题。
另外,赵牛同学又提出了一些更bt的扩展,如下:
- 假设每个蚂蚁都有重量,两只蚂蚁碰撞时轻的那个有一定几率从旁边被撞下去:(,那又该怎样?
- 假设不是被撞下去而是有一定几率被撞晕而停滞几秒,那又该怎样?
- blablabla...
- 蚂蚁爬杆问题
- 蚂蚁爬杆
- 蚂蚁爬杆
- 蚂蚁爬杆
- java蚂蚁爬杆
- 蚂蚁爬杆
- bjtuOJ1137 蚂蚁爬杆
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆
- 蚂蚁爬杆问题
- 蚂蚁爬杆+uva10881
- 蚂蚁爬杆
- 蚂蚁爬杆
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 蚂蚁爬杆问题
- 4.7 蚂蚁爬杆
- mmap
- hdu 2474 Process scheduling
- 在codecademy上学习Python
- 用PV操作实现多线程间同步互斥(PV)
- 《struts---利用struts的标签,实现简单的表单提交及校验》
- 蚂蚁爬杆
- 【转】ring3 CPU指令级别--操作内核的一些系统级别工具
- 黑马程序员——day22GUI图形用户界面
- ASP.NET Get 和Post的区别
- debian中shell脚本无法使用source的原因及解决方法
- 线程安全的内存池 c++ 实现尝试(一)
- hdu 2602 Bone Collector
- 胜者树与败者树
- postgresql 使用整理:分表与触发器