当青训营遇上码上掘金
题目如下
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。 步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1 公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
摘要
寻朋之旅的暴力解题思路,首先判断是在左边还是在右边, 如果是在左边,则判断直接移动还是公交移动哪一个更好, 如果直接更好,则直接移动过去,反之则选择坐公交, 如果到达右侧,则一步一步行走微调过去,即可得出结论
解题思路-暴力解题1
我们可以分为两种情况, 情况1-小码在小青的左边,需要向数轴右侧移动,这个时候可以做公交和步行,计算k*2即做了公交车, 如果abs(k*2-n)的值大于n-k,这个时候应该选择步行,而非选择坐公交.重复计算,如果k=n则到达小青家,输出计算的次数即可完成,或者当k>n的时候进入微调的阶段,此时小码在小青的右侧或,我们则需要向左侧移动, 左侧移动的唯一方式就是k=k-1,直到k=n的时候输出次数即可
解题思路-暴力解题2
参考上面的解题思路,但是有一个无法解决的点,就是每次计算均需要计算 abs(k*2-n)>=n-k, 这样计算很麻烦,我们可以倒过来,由n推导出k.
当n>k时候即小码在小青的右侧,此时可以用k1=n/2记录一次(公交),如果k1在n的左侧,则进入微调环节, k1-1直到k1=k为止, 但是这样移动会遇到有余数的情况,可以在有余数的情况时候,先进行k1+1,直到没有余数为止.
当然还是有同样的问题,就是k1=n/2和k1=n-1,当k=20, n=18的时候,很明显移动两步,比坐一次公交车更节省,计算abs(k1-n)的数是否小于(k1/2-n),进行选择
结论
暴力破解是我想到的唯一方法,如果有其他更好的方法,欢迎大家提出