寻友之旅 | 「青训营 X 码上掘金」

71 阅读2分钟

当青训营遇上码上掘金

主题介绍

小青要找小码玩,他们的家在一条直线上,当前小青在地点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为已经花费的时间,我们采取下面的分类讨论:

  1. N=K 最快时间=T
  2. N>K 最快时间=T+N-K
  3. 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)
}

小结

本人没有学过什么算法,也不知道做的是否正确,如果您发现了文章的错误或不足,欢迎在评论区和我交流。