当青训营遇上码上掘金
主题介绍
小青要找小码玩,他们的家在一条直线上,当前小青在地点N,小码在地点K(0≤N,K≤100000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点X移动到节点X-1或X+1
公交:小青可以在一分钟内从任意节点X移动到节点2*X(公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久? 输入:两个整数N和K 输出:小青到小码家所需的最短时间(以分钟为单位)
解题思路
只要X≥1,那么公交的移动速度就必然大于步行,我们应该尽可能的多使用公交。当K为偶数时,则到达地点K的前一步最好为地点X=K/2时做公交,当K为奇数时,则到达地点K的前一步为从地点K+1步行至地点K,前二步为从地点X=K+1/2做公交到达地点K+1,当然也可以前一步先到达K-1,前二步再从X=K-1/2到K-1。
对于给定的N和K,假定T为已经花费的时间,我们采取下面的分类讨论:
- N=K 最快时间=T
- N>K 最快时间=T+N-K
- N<K 如果N×2<=K,则N=N×2,T=T+1 如果N×2>K,则最快时间=min{N×2-K,K-N}
代码实现
package main
import (
"fmt"
)
func main() {
var N, K, T int // N为起始点,K为目的地,T为时间
fmt.Scanf("%d%d", &N, &K)
for {
if N == K {
break
} else if N > K {
T += N - K
break
} else if N < K {
if N*2 <= K {
N *= 2
T += 1
} else {
if N*2-K < K-N {
T += 1
T += N*2 - K
break
} else {
T += K - N
break
}
}
}
}
fmt.Println(T)
}
小结
本人没有学过什么算法,也不知道做的是否正确,如果您发现了文章的错误或不足,欢迎在评论区和我交流。