题目描述
解题思路
target的范围有正有负,而起点为0,所以根据对称性实际上target=i与target=-i的答案是相等的,所以我们实际上只需要把target为负数的情况取反然后只需要讨论target为正数的情况即可。
如上图所示,数字表示坐标,之后的第i行的勾表示第i次移动能到达的位置,由此可以知道,第i次移动能到达的最远位置坐标为(1+2+3+……+i),那么我们就可以直接从第一个移动到最远位置坐标大于target的那一次移动开始找,这样可以提高一些效率,记该次移动为第k次移动,若第k次移动无法到达target,则判断k的奇偶性,若k为奇数,则第(k+2)次一定能到达target,若k为偶数,则第(k+1)次一定能到达target,以上结论请读者自行画图得出,图画出来后这些规律就一目了然了。
代码
#include<iostream>
#include<math.h>
using namespace std;
int reachNumber(int target) {
target=abs(target);
int i;
for(i=int(sqrt(target*2));(1+i)*i/2<target;i++);
if(((1+i)*i/2-target)%2==0)return i;
if(i%2)return i+2;
return i+1;
}
int main(){
int t;
cin>>t;
cout<<reachNumber(t)<<endl;
return 0;
}