【经典问题】蚂蚁爬杆问题

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

( 转载请注明出处.......... 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
____<-______->

两个蚂蚁不会相遇,2s后所有蚂蚁掉下,总路程3步


那么这一类问题怎么解决呢?枚举?似乎。。。。。。。


我们先来思考一个问题,如果不掉头而是擦肩而过会怎么做呢?只需要把每个蚂蚁走的路程加起来就是总路程,最长的哪一个 路程 / 速度 就是总时间

至于求每个蚂蚁走的路程就不说了,设位置为pos,如果向左,那么time=pos,否则time=L-pos

想上面如果不考虑掉头是不是很简单?


<

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值