当青训营遇上码上掘金
题目描述
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 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