go语言写主题 3:寻友之旅

57 阅读2分钟

当青训营遇上码上掘金

题目描述

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

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

公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走) 请帮助小青通知小码,小青最快到达时间是多久? 输入: 两个整数 N 和 K 输出: 小青到小码家所需的最短时间(以分钟为单位)

思路:将小青家的节点作为起点建立一个坐标系。以小青为n节点,小码在k节点,如果小青坐一次公交车,依然无法到达小码家,那么这段路程一定是坐公交车更快,相当于坐公交车的所有路程全部有效,不需要往回走,而这个时候,坐公交车花费的时间是1,而步行花费的时间是x,x>=1,所以我们只需要考虑,当小青坐公交车坐过了小码的家,再往回走跟直接走到小码家的时间,所以我们最开始直接坐公交,每次坐公交都判断下一站是否会超过小码家,如果会超过,再比较这次路程,直接坐公交再往回走,和直接走去小码家的时间。

代码

package main

import (
   "fmt"
)

func main() {
   // %d 表示整型数字,%s 表示字符串
   var n, k int
   fmt.Scan(&n, &k)
   time := 0
   for n < k {
      n = n * 2
      time++
   }
   //最后一次路程坐公交所需要的时间
   gongjiao := n - k
   //最后一次路程步行所需要的时间
   buxing := k - (n / 2)
   if gongjiao < buxing {
      time += n - k
   } else if buxing <= gongjiao {
      time--
      time += k - (n / 2)
   }
   fmt.Println(time)
}

测试

输入:1 9 输出:4