寻友之旅|「青训营 X 码上掘金」主题创作
当青训营遇上码上掘金
【题目】小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
【思路】由题目可知,n、k均小于10^5,因此时间复杂度最好不要超过On^2即可。
首先,由题目可知,我们可选择的转移方式主要有三种:-1,+1与x2(动态规划)
其次,我们也容易发现,在距离较远的情况下x2是最快的(贪心)
最后,我们还需注意,当移动距离超过k时,我们就只能选择-1(特殊情况)
由以上分析,我们便可得到两种解答方式,此处我选择我认为较为简单的一种方式(贪心)
【java代码】
public class Main {
public static void main(String[] args) {
int t = getMinTime(1,100);
System.out.print(t);
}
// 贪心
public static int getMinTime(int n,int k) {
if(n >= k) {
return n-k;
}
int ans = -1;
while(n <= k) {
ans = Math.min(2*n-k,k-n);
n*=2;
}
return ans;
}
}
【其他】 起初我想到的是搜索(bfs),因为这种探路找最优情况的题目比较容易联想到,且这个题目的数据量并不算大,但想过之后发现并不需要这样做,贪心的做法也是可以的(既然可以贪心了,那一定可以动态规划,三种情况实现了即可)