蚂蚁掉落问题

偶遇一个有意思的编程题,其实是个智力题。
问题:
n 只蚂蚁以每秒1cm 的速度在长为Lcm 的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细,两只蚂蚁相遇时,它们不能交错通过,只能各自反向爬回去。对于每只蚂蚁,我们知道它距离竿子左端的距离xi,但不知道它当前的朝向。请计算所有蚂蚁落下竿子所需的最短时间和最长时间。
思路:
看到这个问题的第一反应是推极端,最短时间是极端情况,最长时间也是极端情况,那么极端情况下的答案就是所要的问题。
首先,最短。当然是每个蚂蚁不相碰,朝离自己近的那个端点爬过去。最后一只掉落的时间就是最短时间。我们假设用distance[n]来记录每只蚂蚁距离左端点的距离。那么上述思路转化为代码就是:

for(int i=0;i<n;i++)
{
	minT=max(minT,min(distance[i],L-distance[i]));
	//minT是这只蚂蚁爬到最近的端点(左右端点距离比较取小),所有里面取大
}

然后,最长。和最短一样,所有的朝最远的端点爬,取最大的。开始分析的时候,我想的是蚂蚁碰头掉头对于本身来说应该距离是不会变化的,于是首先举几个例子试了下,发现在变化,但是好像又哪里不对劲。仔细一想,其实sum是没有变的。为什么?数学论证比较繁琐而且不形象,一语就可以道破,蚂蚁在碰到后互相掉头,对于单个来说的话确实变了,因为变向了。但是如果两个一起看,不过就是接力罢了,大家都是蚂蚁,你换方向代替我,我换方向代替你。来看形象点,1------><-------1,-------->11<---------,-1<------>1-,你看,换向了,但是整体来看看不出不同,所以,掉头跟擦肩其实一样,所以这就成了每只朝最远的距离问题。

for(int i=0;i<n;i++)
{
	maxT=max(maxT,max(distance[i],L-distance[i]));
	//maxT是这只蚂蚁朝最远爬的时间,(左右端点取大),然后取最大
}

over。
数学是工具,思路是发动机,优秀的思路总能一脚油门简化数学模型。

你可能感兴趣的:(蚂蚁掉落问题)