青训营 X 码上掘金-寻友之旅

99 阅读2分钟

当青训营遇上码上掘金这是关于码上掘金第三题的介绍

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()

总结

感谢字节和掘金给我这次宝贵的学习机会,这次确实受益匪浅,如果上述代码有什么不对请各位同好批评指正以及一起交流。我们都有光辉的未来冲冲冲!!