当青训营遇上码上掘金

69 阅读2分钟

各位青训营的码友们,大家好!

我本次的[青训营 X 码上掘金]主题创作活动选择的主题是 主题3:寻友之旅。选择的语言为Python语言。 

主题要求

小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 

步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 

公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走) 请帮助小青通知小码,小青最快到达时间是多久? 

输入: 两个整数 N 和 K 

输出: 小青到小码家所需的最短时间(以分钟为单位) 

解题思路

首先,通过读题可知,公交车是不可以向反方向走的,所以当小青N比小码K大时就不可以坐公交了,只能够通过小青步行到达小码家;只有在小青N比小码K小时,就有步行和公交两种出行方式。 

这个问题可以分三种情况讨论: 

 1. 当N和K相等时,最短用时为0; 

 2. 当N比K大时,因为公交车不能向后走,此时小青只能选择步行,步行速度是1节点/分钟,小青从N到K最短用时是(N - K)分钟; 

 3. 当N比K小时,小青可以直接步行过去,也可以先步行到离K比较近的节点再步行,这时我们需要计算两种方法所用时间,选择时短的方法。 

下面是两种方法走法的时间分析: 

 1. 直接步行用时(K - N)分钟 

 2. 使用递归的方法,先乘车一次再计算后续需要的时间,总用时是(1 + 乘车一次后从2N到K所需最短时间) 通过上述思路,编写get_shortest_time函数,分情况处理。

代码如下

以上就是我对于[青训营 X 码上掘金]主题创作活动选择的主题是 主题3:寻友之旅的理解与认识,如有不当之处,欢迎各位大佬批评指正(第一次发布自己的作品,有些紧张)!