当青训营遇上码上掘金
「青训营 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();