编程之美---蚂蚁爬杆

一根长27cm的木棍上,在5个点上有5只蚂蚁,蚂蚁在开始的时候朝任意方向出发,只能掉头或者往前走。让任意两只蚂蚁碰头时,它们同时掉头朝反方向走。假设蚂蚁的速度都是一秒一厘米,求蚂蚁都离开木棍的最短时间和最长时间。

蚂蚁相遇后掉头往反向走,可以看作蚂蚁相遇后,擦肩而过,相当于两只蚂蚁互换了各自的行程。所以把每只蚂蚁离自己较远的一端,和较近的一端计算出来,分别取最大值,就是最长时间和最短时间。

扩展问题 参考网址 http://blog.csdn.net/weichaohnu/article/details/8748138

1、第i个蚂蚁,什么时候走出木杆?

可以想象成每只蚂蚁背着一袋粮食,蚂蚁相遇后,相互交换自己的粮食,蚂蚁仍掉头。假设刚开始有m只蚂蚁往右走,n-m只蚂蚁往左走,则最后一定有m只蚂蚁从右边出来,n-m只蚂蚁从左边出来。且从右边出来的的m只蚂蚁一定是靠近最右边的m只蚂蚁。因此只要找到第i个蚂蚁背的粮食就可以了。如果第i<=m,那么只要找到最开始往右走的第i袋粮食即可。

2、如果蚂蚁在一个平面上运动,同样也是碰头后原路返回(这样和弹性碰撞不同,不能等同于两个蚂蚁交换继续前进),问蚂蚁如何走出平面?

3、蚂蚁一共会碰撞几次?

时间: 2024-08-06 15:40:04

编程之美---蚂蚁爬杆的相关文章

蚂蚁爬杆问题js实现

面外包时,腾讯导师出的面试题,简单记录一下 运行效果 代码 <!DOCTYPE html> <html> <head> <title>蚂蚁爬杆实验</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script> </head> <body> <div style=&

编程之美4.7 | 蚂蚁爬杆

有一根长为L的平行于x轴的细木杆,其左端点的x坐标为0(故右端点的x坐标为L).刚开始时,上面有N只蚂蚁,第i(1≤i≤N)只蚂蚁的横坐标为xi(假设xi已经按照递增顺序排列),方向为di(0表示向左,1表示向右),每个蚂蚁都以速度v向前走,当任意两只蚂蚁碰头时,它们会同时调头朝相反方向走,速度不变.编写程序求所有蚂蚁都离开木杆的最短时间和最长时间. 解法: 我们假设每只蚂蚁都背着一袋粮食,任意两只蚂蚁碰头时交换各自的粮食然后调头.这种情况下,每次有一只蚂蚁离开木杆都意味着一袋粮食离开木杆(虽然

蚂蚁爬杆问题(Java面向对象)

有一根27厘米的细木杆,在第3厘米.7厘米.11厘米.18厘米.23厘米这五个位置上各有一只蚂蚁.木杆很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退.当任意两只蚂蚁碰头时,两只蚂蚁会同时调头朝反方向走.假设蚂蚁们每秒钟可以走一厘米的距离.编写程序,求所有蚂蚁都离开木杆的最小时间和最大时间. 要求:用类模拟出蚂蚁的行为特性,进而模拟出五只蚂蚁在木杆上的运行过程来编程求解.不能通过数学的方式直接用公式计算. 解题思路: 把每个蚂蚁当作一个对象操作,

4.7 蚂蚁爬杆

题目:有一根树枝,树枝很细,不能同时通过两只蚂蚁.开始时,蚂蚁的头朝左还是朝右是任意的,它们只会朝前走或调头,但不会后退. 当两只蚂蚁碰头时,它们会同时调头朝反方向走. 求所有蚂蚁都离开木杆的最短时间和最长时间. 思想:虽然两只蚂蚁相遇后是调头往反方向走,但是,可以"看作"两个蚂蚁相遇后,擦身而过. 也就是说,可以认为蚂蚁的运动是独立的,是否碰头并不是重点. 所以,程序只需要遍历所有的蚂蚁,把每个蚂蚁走出木杆的最长时间(蚂蚁向离自己较远的一端走去),最短时间(蚂蚁向离自己较近的一端走去

面向对象蚂蚁爬杆的问题

package cn.hncu.day5.ant; public class Ant { private int pos; private boolean isLeft = true;// 默认朝左 private boolean isDown = false;// 默认在细杆上 private final static int LEFT_END=0; private final static int RIGHT_END=27; private static int numOfDown; pri

蚂蚁爬杆问题

思路, 为了考虑最长的时间,假设两只蚂蚁相遇后不调头,这样每只蚂蚁都是独立运动的,只要求蚂蚁到杆子端点的距离就好了 int L, n; int arr[MAX_N]; int solve() { int minT = 0; for(int i=0; i<n; ++i) { minT = max(minT, min(arr[i],L-arr[i])); } int maxT = 0; for(int i=0; i<n; ++i) { maxT = max(maxT, max(arr[i],L-a

蚂蚁爬杆

问题: 解答: 伪代码如下: void CalcTime(double Length,// length of the stick double *XPos,//position of an ant,<=length int AntNum,  //number of ants double Speed, //speed of ants double &Min,//return value of the minimum time double &Max)//return value o

【编程之美】目录

第1章  游戏之乐——游戏中碰到的题目 1.1 让CPU占用率听你的指挥 1.2 中国象棋将帅问题 1.3 一摞烙饼的排序 1.4 买书问题 第2章  数字之魅——数字中的技巧 2.1 求二进制中1的个数 2.2 不要被阶乘吓倒 2.3 寻找发帖"水王" 2.4 1的数目 2.5 寻找最大的K个数 2.6 精确表达浮点数 2.7 最大公约数问题 2.8 找符合条件的整数 2.9 斐波那契(Fibonacci)数列 2.10 寻找数组中的最大值和最小值 2.11 寻找最近点对 2.12

编程之美之买票找零

题目:假设有2N个人在排队买票,其中有N个人手持50元的钞票,另外有N个人手持100元的钞票,假设开始售票时,售票处没有零钱,问这2N个人有多少种排队方式,不至使售票处出现找不开钱的局面? 分析:队伍的序号标为0,1,...,2n-1,并把50元看作左括号,100元看作右括号,合法序列即括号能完成配对的序列.对于一个合法的序列,第0个一定是左括号,它必然与某个右括号配对,记其位置为k.那么从1到k-1.k+1到2n-1也分别是两个合法序列.那么,k必然是奇数(1到k-1一共有偶数个),设k=2i