当青训营遇上码上掘金
题目:寻友之旅
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
思路
首先分析题目可以得知小青有三种移动方式(和上周的一个周赛dp题好像),求最快的到达时间,我们可以考虑贪心(比dp好想一些),因为我们这里没有说坐公交和走路的代价不同,那么我们优先选择坐公交,因为乘2也是代价加一,不乘也是,优先选择乘2能最大程度加快进度。
此时就可以写出第一段代码,如果n(小青的位置)乘以2小于小码的位置,就让他一直坐公交,否则就跳出循环,跳出循环之后考虑三种情况。
第一种情况是直接到了,第二种是往前走的代价小,第三种是坐完公交车再往回走代价小,这里我们就要去取一个最小值,坐公交的时间加上他们两个当前的距离就是往前走的代价,再坐一次公交之后的距离加上一次公交的代价加上之前做公交的代价就是第一和第三种情况的代价,两者取最小。
比如1 8,循环到4跳出来,此时的代价是2,要判断的是 2 + 4 和 2 + 1 + 0(n * 2 - m) 谁更小,肯定是第二个,也就是再坐一次公交。
还有个特殊情况是小青所在的位置是0,要先+1再乘。
代码如下: