当青训营遇上码上掘金
题目:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 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
输出结果:
结尾
本人小白初学者,采用了最笨的穷举法,如有错误敬请指出。感谢大家的阅读!希望大家在青训营的学习中都能有自己的收获!