当青训营遇上码上掘金

59 阅读2分钟

当青训营遇上码上掘金

「青训营 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();
    }
}

rhHCFQzs - 码上掘金 (juejin.cn)

输入输出示例

输入: 3 11

输出: 3

解释: 第1次,乘坐公交,可以到达6; 第2次,乘坐公交,可以到达12; 第3次,步行往回走到达11。

输入: 3 4

输出: 1

解释: 第1次,步行到达4。

输入: 3 5

输出: 2

解释: 第1次,乘坐公交到达6; 第2次,步行往回到达5