当青训营遇上码上掘金

110 阅读1分钟

当青训营遇上码上掘金

「青训营 X 码上掘金」主题创作

题目:寻友之旅

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

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

思路

首先通读题意,知道小青去找小码总共有俩种交通方式。

一种为走路: 每分钟移动一格,且可以前后走。

另一种为公交车: 每分钟可以移动到2X,但不能往后走。

第一种情况

因为题目并没有说N一定小于K,所以当N大于等于K时,小青只能走路去小码家,此时所用时间是N-K。

if(K<=N){
   	        System.out.println(N-K);
        }

第二种情况

当N小于K时,根据贪心算法知,尽可能多的使用公交车能够使时间最短。

设搭乘公交车的时间为a,于是循环直到

N*(Math.pow(2,a))>=K

此时确保的是搭公交车一定坐过了小码家。

所以只需要判断到底是坐过小码家的时间短,还是在坐过小码家前一站的时间短。

A = N * (Math.pow(2,n-1));//没坐过小码家的位置
B = N * (Math.pow(2,n));//坐过小码家的位置

判断下列左右两边谁比较大,小的那侧即是所用时间最少的方案。

(K - B + A - 1) > (C - K + A)

最后写完后记得关闭scanner

 scanner.close();