当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
题解
有多种情况,第一种情况首先是N<K情况这时的算法思路为贪心算法,对于小青而言不断选择局部最右解也就是一直乘坐公交位置坐标N2,直到N2大于K之前判断是先N*2然后步行更快还是直接步行更快,第二种情况是N>K,这种情况直接结果为K-N,第三种情况为N=K.这种情况结果也可以用K-N表示。
代码解释
首先fmt.Scan函数获得输入N以及K,for循环判断只要N小于K就(N*2)一直乘坐公交,并且ans+1,只要N大于或者等于K了就判断现在通过步行(K-N)的总结果(ans + N - K)与N>K之前最后一次不乘坐公交直接进行步行的结果(ans - 1 + K - N/2)相比较,ans最终结果为两者较小值,最后通过fmt.Println(ans)输出结果 项目代码如下:
思考
我使用的是贪心算法,但这道题可以使用广度优先搜索算法(BFS),还看到过有人使用堆优化的迪杰斯特拉算法。