题目描述


解题思路
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;
}
本文探讨了一种高效算法,用于确定从坐标原点出发,通过一系列有序移动到达目标坐标所需的最少步数,考虑了正负目标值对称性,特别适用于移动问题的对称性优化。关键在于找到最远可达位置并利用移动的对称性简化搜索过程。
242

被折叠的 条评论
为什么被折叠?



