当青训营遇上码上掘金之寻友之旅

83 阅读1分钟

当青训营遇上码上掘金

题目:寻友之旅

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

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

解题思路:

(1)当N>=k时

此时显然只能通过步行向后走从N到达K,所以小青到小码家的最短时间为(N-K)分钟;

(2)当N<k时

此时可能有三种情况:

(1)小青直接坐公交到小码家

(2)小青先步行再坐公交到小码家

(3)小青先步行再坐公交再步行到小码家

由此可得出以下的等价式(N+X)*2^Y+Z=K,此题可转换为求|X|+|Y|+|Z|的最小值

代码实现(java)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n,k,sum=0,x,y,z,max1,max2;
        n = in.nextInt();
        k = in.nextInt();
        if(n>=k) sum=n-k;    //由于公交不可以向后走,所以此时只能选择步行
        else
        {
            max2=k-n;        //只选择步行的方法,为最大的时间选择;
            sum=max2;
            for(z=-max2;z<=max2;z++)
            {
                for(x=-max2;x<=max2-Math.abs(z);x++)
                {
                    for(y=0;y<=max2-Math.abs(x)-Math.abs(z);y++)
                    {
                        if((n + x) * (int) Math.pow(2.0, (double) y)+ z == k && sum>Math.abs(x)+y+Math.abs(z))
                        {
                            sum=Math.abs(x)+Math.abs(z)+y;
                        }
                    }
                }
            }
       }
        System.out.println(sum+"分钟");
    }
}

结果展示

测试用例:

7 21

输出结果:

image.png

结尾

本人小白初学者,采用了最笨的穷举法,如有错误敬请指出。感谢大家的阅读!希望大家在青训营的学习中都能有自己的收获!