第一次写博客,可能写的不清楚。
题目:
本人思路:
我们需要求出最小的步数,那么就需要尽可能的速度更大。怎么理解呢?想一下自己每秒都在赶路,那么你想要尽可能到达目的地,肯定是需要速度越快越好(这个理解很关键),就相当于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);
}
}