题目描述
考虑你从家出发步行去往一处目的地,该目的地恰好离你整数单位步长(大于等于1)。你只能朝向该目的地或者背向该目的地行走,而你行走的必须为单位步长的整数倍,且要求你第N次行走必须走N步。
请就给出目的地离你距离,判断你是否可以在有限步内到达该目的地。如果可以到达的话,请计算到达目的地的最短总步数(不能到达则输出-1)。
输入描述:
1个整数:目的地离你距离T
输出描述:
1个整数:最短总步数(进行了多少次行走)
输入
2
输出
3
说明
距离目的地2, 需要3步:朝向走1,背向走2,朝向走3
思路:
先一直向前走,使得sum >= target,如果步数小于这个数是不可能到达的
当sum > target 后,再考虑能否将之前的步伐反向来恰好到达目的地
假设第 i-1 步没有超出距离,第 i 步超出了距离 x,如果 x 是个偶数就好办了,我在第 x/2 步中选择后退就行了,其余的行走计划按照原样,那么这样一个新的行走计划正好比原始计划要往后退 x 的长度,正好到达终点;若 x 是个奇数,那么继续往前走,直到超出的距离为一个偶数为止,需要后退哪一步与前面的计算方法相同。
当超出的距离为偶数时,实际行走方案就已经知道了,即在原始行走计划的基础上,将 x/2 步从前进改为后退即可,总步数是不变的
import java.util.*;
public class Main{
public static int reachNumber(int target) {
int step = 0;
int sum = 0;
while(sum < target){
step++;
sum += step;
}
while( (sum - target) % 2 != 0 ){
step++;
sum += step;
}
return step;
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int step = reachNumber(n);
System.out.println(step);
}
}