到达终点数字

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


题目描述

image-20220305152155459

image-20220305152215822


解题思路

target的范围有正有负,而起点为0,所以根据对称性实际上target=i与target=-i的答案是相等的,所以我们实际上只需要把target为负数的情况取反然后只需要讨论target为正数的情况即可。

e1e5833442222c1059f067ac6fcb583

如上图所示,数字表示坐标,之后的第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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值