#include <iostream>
using namespace std;

int f(int x){
    if(x < 3){
        return x;
    }
    else if(x % 2 == 0){
        // return f(x - 1) + f(x / 2);
        return  f(x/2) + 1;//偶数最小值是f(x/2)+1,只用看一半前的部分需要的步数
    }
    else if(x % 2 != 0){
        return min(f(x - 1), f(x + 1)) + 1;
    }
    return 0;//如果都不满足则为0
}

int main() {
    int n;
    cin >> n;
    if(n < 0){
        n = -n;//只考虑正数
    }
    int a = f(n);
    cout << a << endl;
    return 0;
}

使用动态规划思想,当x<3时(其实==3也行,代码忘记改了),x的值就是最小步数,大于这个数时,要想得到最小步数,就是看一半处的(越到后面,+1,-1会用的少),偶数就很简单,直接取一半,奇数分类讨论一半前是+1后的还是-1后的