青训营主题创作

69 阅读2分钟

当青训营遇上码上掘金

进行青训营已有一段时间,今天有时间来完成一下青训营的主题代码创作
看了看研究了主题3,问题如下:

  • 主题 3:寻友之旅

    小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
    步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
    公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)

    请帮助小青通知小码,小青最快到达时间是多久?
    输入: 两个整数 N 和 K
    输出: 小青到小码家所需的最短时间(以分钟为单位)

    看到这个题目,我首先想到的思路是从按先公交后步行的方法
    众所周知,指数增长的速度是十分之快的,而公交车2x的移动方式自然成了我的首选
    但稍加思考一下就能注意到指数增长在N为0的点有局限性
    需要+1来把系数进行初始化
    也就是说先走 N2tN*2^t或者N2t+1N*2^{t+1}中离K最近的距离
    然后再用可左右灵活移动的步行进行加减补足剩余的距离
    但数字稍微一大,这个方法明显的缺陷就显露了出来
    当落在N2tN*2^tN2t+1N*2^{t+1}中间的位置时,步行所需时间十分地大,显然不是最优解法

    那么就考虑从后往前倒推的思路
    公交的效率高,那么肯定是主要移动方式,距离越远越是如此
    那么考虑倒推,把最终的位置K除以2得到上一分钟的节点K'
    又因为是整数,中间需要进行+-1的调整来保证被除数为偶数
    倒推时我采用-1的方式 同时在每次-1或/2时进行计数 分别代表着走路或公交
    当最终不大于N时停止 输出计数即为耗费的分钟数

    程序运行后分别输入N、K的值
    最终输出时间 程序采用go语言编写,在研究读取输入参数时考虑过直接用os.Args
    但读入的为字符串无法转化为整型 搜索后发现同c语言的fmt.Scanf直接读入更为方便
    同时也注意到go的输入输出接口有众多函数可以使用
    接下来要花时间研究一下