( 转载请注明出处.......... http://blog.csdn.net/jiangzh7 ................. By Jiangzh )
先说说是什么问题:
告诉你有一个长为L(L<=10000)的木杆,上面有N(N<=1000)个蚂蚁,他们一开始的朝向随机,他们会以一定的速度一直向当前方向走,直到两只蚂蚁相遇,他们会立即掉头(即往相反方向走),注意,掉头不耗时间。问多久后蚂蚁全部掉下木杆,所有蚂蚁走的总路程是多少?
为了方便,我们假设速度为 1 ( 即每一秒走一步 )
好,问题到此结束,我们先来模拟一下,比如下面一个图
0___1___2___3___4___5
____->______<-
上面两个箭头表示两只蚂蚁的朝向,很明显他们会在2相遇后立即掉头,然后左边的蚂蚁再走两步掉下,总共三步,而右边那一只还需要走三步,总共四步,那么 4s 后所有蚂蚁都会掉下木杆,总路程为7步
再如下面
0___1___2___3___4___5
____<-______->
那么这一类问题怎么解决呢?枚举?似乎。。。。。。。
我们先来思考一个问题,如果不掉头而是擦肩而过会怎么做呢?只需要把每个蚂蚁走的路程加起来就是总路程,最长的哪一个 路程 / 速度 就是总时间
至于求每个蚂蚁走的路程就不说了,设位置为pos,如果向左,那么time=pos,否则time=L-pos
想上面如果不考虑掉头是不是很简单?
<

本文探讨了一个经典的蚂蚁爬杆问题,其中蚂蚁随机朝向并以恒定速度行走,遇到时会立即掉头。通过分析,提出了一种将相遇视为身份交换的简化思路,从而在O(N)时间内解决问题。文章提供了C++代码实现,并讨论了如何处理包含蚂蚁掉落顺序的更复杂情况,通过使用正负值表示蚂蚁方向进行排序来确定掉落顺序。
最低0.47元/天 解锁文章
4086

被折叠的 条评论
为什么被折叠?



