计算从位置 x 到 y 的最少步数20241023

第一次写博客,可能写的不清楚。

题目:

本人思路:

我们需要求出最小的步数,那么就需要尽可能的速度更大。怎么理解呢?想一下自己每秒都在赶路,那么你想要尽可能到达目的地,肯定是需要速度越快越好(这个理解很关键),就相当于100冲刺一直加速一样。但是我们题目最后还要求减速到开始的速度。如果我们不是现在+1,-1,0,而是可以直接持续加速,然后再慢慢减速,速度和时间组成的二维坐标完全对称,这里我们可以很容易想到一个最高速度。本题目,也是同样原理,因为加速和减速距离是对称的原因,我们现在只考虑最高速度,和加速路程,然后根据对称算出减速的路程。但是题目给出的数据不完全是加速和减速可以完成的距离,我们可以找出对应速度停靠一下。这里就需要分类讨论一下:

我们理解一下下面的例子就可以了。

假如我们需要完成的距离是6,7,8,9,10,11,12

距离是6:1  2  2  1            

距离是7: 1  2  2  1  1

距离是8: 1  2  2  2  1

距离是9: 1  2  3  2  1     

距离是10:1  2  3  2  1  1

距离是11:1  2  3  2  2  1  

距离是12:1  2  3  3  2  1

距离是6和12的时候,最大加速度分别是2和3,并且整个过程加速和减速对称的情况。

至于7~11,比6大1~5:可以用1~3拼凑出。

本题答案:

public class Main {
    public static int solution(int x_position, int y_position) {
       
        
        int distance =Math.abs(x_position - y_position);
        
       int total=0;  // 目前走的路程
       int steps=0;  // 目前步数
       int current_step=1;  // 开始速度
       while(total<distance)
       {
        steps+=1;
        total+=current_step;
        if((total+current_step+1)*2<=distance )
        {
            current_step++;  // 没有到目标路程一半就继续加速
        }
        else{
            if(distance==total*2)
            {
               return steps*2;  // 刚好路程是加速距离的两倍
            }
            else if((distance-2*total)<=(current_step+1))
            {
                return steps*2+1;  // 路程比加速两倍大,但是不够下一个加速度的距离。那么可以选择在对应速度下停一秒。
            }
            else {
                return steps*2+2;  // 比下一个加速度大,但是小于下一个加速度的两倍,所以可以在1~current_step+1之间选出两个数字凑出距离。
            }
            
        }
       
       }
        return steps;
    }

    public static void main(String[] args) {
        // You can add more test cases here
        System.out.println(solution(12, 6) == 4);
        System.out.println(solution(34, 45) == 6);
        System.out.println(solution(50, 30) == 8);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写代码越来越顺溜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值