(环形追及问题)A、B、C、D四只蚂蚁在一个正方形的操场上跑步,他们的速度分别为1圈/分钟,1.5圈/分钟,2圈/分钟,2.5圈/分钟。他们不带起始位置和带起始位置的解决。
求解:(1)十分钟后蚂蚁间两两相遇的次数。
(2)九分钟后蚂蚁间两两相遇的次数。
(3)若开始时A在起点,B在操场的1/4处,C在操场的1/2处,D在操场的3/4处,又如何?
首先我们来分析这个问题,环形追及相遇问题有一个默认的已知条件:
当快的追上慢的的时候经过的路程差(此处为路程差,手机上看到的路程是错误的)刚好为跑道一周的长度。
由此我们可以得到一个公式:
跑道一周的长度=速度差×追及时间
由题已知速度差和跑道长度可以根据公式计算得出追及时间
追及时间=跑道一周的长度÷速度差
因为每一次追上之后对于环形而言又是全新的开始所以:
相遇的次数=总时间÷追及时间
这道题(1)(2)问只需算出这些蚂蚁两两之间的追及时间即可简单得出结论。
因为剩下的步骤都是一些重复的计算所以可以考虑用代码完成
(1)(2)问代码实现如下
#python3
#定义一个蚂蚁类,这个蚂蚁类有名字属性和速度属性
class Ant(object):def __init__(self, name, speed):self.name = nameself.speed = speed#追及时间=跑道一周的长度÷速度差
def catch(ant1, ant2):#time为快的和慢的相遇一次的时间。time=0time = 1.0/abs(ant1.speed-ant2.speed)return time#相遇的次数=总时间÷追及时间
#此题中次数为浮点数则为未完成,所以采用地板除。
def count_time(i, ant, temp, run_time, total_time):catch_time = catch(i, ant[temp])catch_num = run_time // catch_timetotal_time.append(catch_num)print("%s<-->%s:相遇一次的时间为%.2f分钟,%s分钟内相遇%s次" % (i.name, ant[temp].name, float(catch_time), run_time, catch_num))def main():num = 0#记录所有蚂蚁之间两两相遇的次数。total_time = []#创建蚂蚁A,让蚂蚁A以速度1圈/分跑起来A = Ant("蚂蚁A", 1)# 创建蚂蚁B,让蚂蚁B以速度1.5圈/分跑起来B = Ant("蚂蚁B", 1.5)# 创建蚂蚁C,让蚂蚁A以速度2圈/分跑起来C = Ant("蚂蚁C", 2)# 创建蚂蚁D,让蚂蚁D以速度2.5圈/分跑起来D = Ant("蚂蚁D", 2.5)ant = [A, B, C, D]run_time = float(input("请输入蚂蚁跑步的时间:"))for i in ant:if i == A:for temp in range(1, 4):count_time(i, ant, temp, run_time, total_time)elif i == B:for temp in range(2, 4):count_time(i, ant, temp, run_time, total_time)elif i == C:for temp in range(3, 4):count_time(i, ant, temp, run_time, total_time)for i in total_time:num += iprint("在%s分钟后四只蚂蚁两两相遇的次数为:%s" % (run_time, num))if __name__ == '__main__':main()
在(3)中蚂蚁们有了初始位置,我们可以先把从初始位置开始的他们第一次追上的时间算出来,余下时间的相遇次数就和(1)(2)问的计算方法相同,只需在计算的次数上加一即可。
而第一次追上的时间one_catch_time根据已知可以得到
初始位置:loca
one_catch_time = (圈长 - 快的loca + 慢的loca) ÷ 速度差
代码如下:
#python3
#定义一个蚂蚁类,这个蚂蚁类有名字属性速度属性和初始位置属性
class Ant(object):def __init__(self, name, speed, loca):self.name = nameself.speed = speedself.loca = loca
#追及时间=跑道一周的长度÷速度差
def catch(ant1, ant2):#time为快的和慢的相遇一次的时间。time=0time = 1.0/abs(ant1.speed-ant2.speed)return time#相遇的次数=总时间÷追及时间
#此题中次数为浮点数则为未完成,所以采用地板除。
def count_time(i, ant, temp, run_time, total_time):#计算第一次追上的时间one_catch_time = (1 - ant[temp].loca + i.loca) / abs(i.speed - ant[temp].speed)#第一次追上的时间得出后就可以从第一次追上之后作为起点开始计算,计算得出的次数加一即可。catch_time = catch(i, ant[temp])catch_num = (run_time-one_catch_time) // catch_time + 1total_time.append(catch_num)print("%s<-->%s:相遇一次的时间为%.2f分钟,%s分钟内相遇%s次" % (i.name, ant[temp].name, float(catch_time), run_time, catch_num))def main():num = 0#记录所有蚂蚁之间两两相遇的次数。total_time = []#创建蚂蚁A,让蚂蚁A以速度1圈/分跑起来A = Ant("蚂蚁A", 1, 0)# 创建蚂蚁B,让蚂蚁B以速度1.5圈/分跑起来B = Ant("蚂蚁B", 1.5, 0.25)# 创建蚂蚁C,让蚂蚁A以速度2圈/分跑起来C = Ant("蚂蚁C", 2, 0.5)# 创建蚂蚁D,让蚂蚁D以速度2.5圈/分跑起来D = Ant("蚂蚁D", 2.5, 0.75)ant = [A, B, C, D]run_time = float(input("请输入蚂蚁跑步的时间:"))for i in ant:if i == A:for temp in range(1, 4):count_time(i, ant, temp, run_time, total_time)elif i == B:for temp in range(2, 4):count_time(i, ant, temp, run_time, total_time)elif i == C:for temp in range(3, 4):count_time(i, ant, temp, run_time, total_time)for i in total_time:num += iprint("在%s分钟后四只蚂蚁两两相遇的次数为:%s" % (run_time, num))if __name__ == '__main__':main()
(环形追及问题)A、B、C、D四只蚂蚁在一个正方形的操场上跑步,他们的速度分别为1圈/分钟,1.5圈/分钟,2圈/分钟,2.5圈/分钟。他们不带起始位置和带起始位置的解决。相关推荐
- python朋友圈为什么这么火-利用Python让你的微信朋友圈与众不同,更加高大上
前言 对于发朋友圈,我想很多人都有一种"执念",那就是一定要集齐九张图,没有九张图的朋友圈是没有灵魂的!!! 为了集齐九张图也是煞费苦心,我会告诉你,用Python轻松制作九张图嘛 ...
- 判断两个时间在15分钟内_为什么敷面膜的使用时间要15—20分钟,这个时间怎么算出来的?...
不论是抹的还是贴的面膜,在使用说明上都注明:15-20分钟拿下.这个时间是怎么算出来的?像贴的面膜即便过了时间,还有许多精华液没有被吸收,这个时候这些精华液应该怎么办呢? 其实15~20分钟并不是一个 ...
- python训练营朋友圈留言_用Python发一个高逼格的朋友圈【附代码】
今天二胖要给大家介绍一个Python库: PIL(Python Image Library) 下面我们用一个实际的例子 看看50行python代码可以做什么神奇的事情 这是二胖发的一个朋友圈 切图前是 ...
- python微信朋友圈分享功能_利用Python让你的微信朋友圈与众不同,更加高大上
前言 对于发朋友圈,我想很多人都有一种"执念",那就是一定要集齐九张图,没有九张图的朋友圈是没有灵魂的!!! 为了集齐九张图也是煞费苦心,我会告诉你,用Python轻松制作九张图嘛 ...
- python发朋友圈突破朋友圈限制_用Python发一个高逼格的朋友圈
今天Aimee要给大家介绍一个Python库: PIL(Python Image Library) 下面我们用一个实际的例子 看看50行python代码可以做什么神奇的事情 这是我发的一个朋友圈 切图 ...
- 最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY。
最新推出SAP ECC EHP7最新版本IDES带演示数据,带开发ACCESS KEY. SAP各系统版本安装虚拟机+终身辅导+推荐就业+项目文档+模块PA视频 联系人:tomy(saper) QQ ...
- Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装)
Java EXCEL 表格导入导出(带下拉选-带VLOOKUP函数封装) 对于excel Java POI 使用 目前简单导出导入功能网上很多,但是对于有下拉选,样式等缺点却是最大硬伤,故此封装一个通 ...
- stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解)
stm32f103利用HC06进行蓝牙通信,在7针的OLED屏幕上显示,带数据更新功能(带超详细讲解) 首先看看效果吧 手机端发送一个数据在OLED屏幕上显示 其实蓝牙通信就是个蓝牙转串口的过程,手机 ...
- 小甲鱼老师《带你学C带你飞》的后续课程补充
小甲鱼老师的<带你学C带你飞>系列之前有预告,说有机器人电子制作的续集,但是这么久了还是没有等到,博主在这里根据自己的学习经历,推荐一些学习的资料,可以为小甲鱼老师填一下坑,读者可根据自己 ...
最新文章
- Visual Studio 2005 SQL Server 2005 are COMING!
- 关于行号输出的简单命令
- Quartz Properties 文件
- ABAP ALV检查单元格更新数据
- Java中的秒表-StopWatch
- http://zhcsmx22.blog.51cto.com
- 当前主流量化平台整理201705版
- 为什么不要把ZooKeeper用于服务发现
- java action文件下载_java和Struts2实现文件下载和上传详解
- Eclipse探秘-第一章-Eclipse启动(1)
- gitlab设置项目组成员权限
- Barrett And Montgomery of Polynomials
- 如何提升网络安全应急响应与事件处置能力
- java整型数组转置输出,Java实现数组转置
- 军队武器java代码
- NB-IoT从原理到实践 学习笔记 part1-8
- 奇闻 为什么Xenophon DAO 社区人人都想戴 绿帽子
- seaborn中的色板02详解
- Spring Cloud分布式微服务整体架构
- 雅虎通可以批量添加MSN用户了