寻友之旅|「青训营 X 码上掘金」主题创作

48 阅读2分钟

寻友之旅|「青训营 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),因为这种探路找最优情况的题目比较容易联想到,且这个题目的数据量并不算大,但想过之后发现并不需要这样做,贪心的做法也是可以的(既然可以贪心了,那一定可以动态规划,三种情况实现了即可)