当青训营遇上码上掘金
「青训营 X 码上掘金」主题创作
题目:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
思路
这道题的解决思路为贪心算法。首先要明确的是,公交的速度一定比步行快,因为每次公交的移动距离是步行的两倍,所以我们应该尽量使用公交走,直到到达目的地的前一站为止。
在目的地的前一站,我们需要进行判断:是继续坐公交到达目的地,还是提前下车,再步行到目的地。
此时,我们可以通过比较离目的地的距离,来决定选择哪种方法。如果提前下车再步行到达目的地更近,那么我们就选择步行;否则,我们继续坐公交。
最后,我们可以把所有的路程加起来,得到最短的旅途时间。
上述的思路在java代码中的实现如下:
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
int K = scanner.nextInt();
int time = 0;
while (N < K) {
time++;
if (2 * N <= K) {
N *= 2;
} else {
if (Math.abs(N - K) < Math.abs(2 * N - K)) {
N++;
} else {
N *= 2;
}
}
}
System.out.println(time + Math.abs(K - N));
scanner.close();
}
}
输入输出示例
输入: 3 11
输出: 3
解释: 第1次,乘坐公交,可以到达6; 第2次,乘坐公交,可以到达12; 第3次,步行往回走到达11。
输入: 3 4
输出: 1
解释: 第1次,步行到达4。
输入: 3 5
输出: 2
解释: 第1次,乘坐公交到达6; 第2次,步行往回到达5