Java斗宗强者 2024-09-28 16:20 采纳率: 0%
浏览 270

计算位置x到y的最小步数

问题描述

AB 实验同学每天都很苦恼如何可以更好地进行 AB 实验,每一步的流程很重要,我们目标为了缩短所需的步数。

我们假设每一步对应到每一个位置。从一个整数位置 x 走到另外一个整数位置 y,每一步的长度是正整数,每步的值等于上一步的值 -1+0+1。求 xy 最少走几步。并且第一步必须是 1,最后一步必须是 1,从 xy 最少需要多少步。

样例说明

  • 整数位置 x6,另外一个整数位置 y12 ,我们需要从 x 走到 y,最小的步数为:1221,所以我们需要走 4 步。
  • 整数位置 x34,另外一个整数位置 y45,我们需要从 x 走到 y,最小的步数为:123221,所以我们需要走 6 步。
  • 整数位置 x30,另外一个整数位置 y50,我们需要从 x 走到 y,最小的步数为:12344321,所以我们需要走 8 步。

输入格式

输入包含 2 个整数 xy。(0<=x<=y<2^31

输出格式

对于每一组数据,输出一行,仅包含一个整数,从 xy 所需最小步数。

输入样例

6 12
34 45
30 50

输出样例

4
6
8
  • 写回答

3条回答 默认 最新

  • 猪柳蛋汉堡 2024-10-03 21:26
    关注
    package main
    
    import (
        "fmt"
        "math"
        "time"
    )
    
    func solution(x, y int) int {
        d := int(math.Abs(float64(y - x)))
        if d < 3 {
            return d
        }
        count := 2
        d -= 2
        sum := 0
        step := 1
        for {
            if step+1+sum <= d {
                step++
                sum += step
            }
            if sum > d {
                sum -= step
                step--
            }
            d -= step
            count++
            if d == 0 {
                break
            }
    
        }
        fmt.Println(count)
        return count
    }
    
    func main() {
        fmt.Println(solution(12, 6) == 4)
        fmt.Println(solution(34, 45) == 6)
        fmt.Println(solution(50, 30) == 8)
        fmt.Println(solution(0, 2147483648))
    }
    
    
    评论

报告相同问题?

问题事件

  • 修改了问题 9月28日
  • 创建了问题 9月28日