当青训营遇上码上掘金这是关于码上掘金第三题的介绍
1.题目简介
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
2.思路
其实就是排列组合的简化,公交和步行的组合。 1)首先如果N>=K,就只能步行,因为公交只能向前
N, K = 2, 34214
ans = 0
if N >= K:
print(N-K)
2)如果是N<K,即正常情况,在这种情况下,优先选择公交,而停止条件是什么?是N>=K或者N*2>K,此时只能选择步行,比较这两种情况步行的最短路即答案。从数学公式推证是为,N >= 1(if N > 0),只要是没达到停止条件下,选择公交一定是优先步行,因此 代码如下:
while N < K:
if N*2 > K:
break
N *= 2
ans += 1
tmp = min(abs(N*2-K),abs(K-N))
整体代码
def main() -> None:
N, K = 2, 42131
ans = 0
if N >= K:
print(N-K)
else:
while N < K:
if N*2 > K:
break
N *= 2
ans += 1
tmp = min(abs(N*2-K),abs(K-N))
print(ans+tmp)
if __name__ == '__main__':
main()
总结
感谢字节和掘金给我这次宝贵的学习机会,这次确实受益匪浅,如果上述代码有什么不对请各位同好批评指正以及一起交流。我们都有光辉的未来冲冲冲!!