当青训营遇上码上掘金
主题 3:寻友之旅
小青要找小码去玩,他们的家在一条直线上,当前小青在地点 N ,小码在地点 K (0≤N , K≤100 000),并且小码在自己家原地不动等待小青。小青有两种交通方式可选:步行和公交。
步行:小青可以在一分钟内从任意节点 X 移动到节点 X-1 或 X+1
公交:小青可以在一分钟内从任意节点 X 移动到节点 2×X (公交不可以向后走)
请帮助小青通知小码,小青最快到达时间是多久?
输入: 两个整数 N 和 K
输出: 小青到小码家所需的最短时间(以分钟为单位)
解题思路: 解决问题大概有几种方法:深度/广度优先算法、穷举法,动态规划等。 根据题,动态规划是最优解。动态的本质是把原本的问题拆分成多个小问题,然后依次解决小问题,最后解决最终问题。
小青和小码的家在同一条直线上,小青的出行方式有两种,1保证行,2,公交且不能后退。对于点i: 有两种情况: 1.小码家在小青家n这个点的前面,公交就没办法选择了,因为公交不能后退,所以只能选择步行,那么最短时间 n - i 2.小码家在小青家后面,所以可以选择公交: i 是奇还是偶 奇:minTime[i] = Min(minTime[i-1] + 1,minTime[i+1]/2+2) 偶:minTime[i] = minTime[i/2]+1
因为最近学习了golang,所以选择使用go语言得方式来实现代码,后续更新java方式。
var n int
var k int
fmt.Println("请输入n和k:")
fmt.Scanf("%d %d", &n, &k)
minTime := make([]int, k+1)
for i := 0; i < k+1; i++ {
if i <= n {
minTime[i] = n - i
} else {
if i%2 == 0 {
minTime[i] = minTime[i/2] + 1
} else {
minTime[i] = Min(minTime[(i+1)/2]+2, minTime[i-1]+1)
}
}
}
fmt.Println("最短时间:", minTime[k])