刷题39 计算从位置x到y的最小步数 | 豆包MarsCode AI刷题

61 阅读3分钟

题目描述

小F正在进行一个 AB 实验,需要从整数位置 x 移动到整数位置 y。每一步可以将当前位置增加或减少,且每步的增加或减少的值必须是连续的整数(即每步的移动范围是上一步的 -1+0 或 +1)。首末两步的步长必须是 1。求从 x 到 y 的最少步数。 样例说明 整数位置 x 为 12,另外一个整数位置 y 为 6,我们需要从 x 走到 y,最小的步数为:1,2,2,1,所以我们需要走 4 步。 整数位置 x 为 34,另外一个整数位置 y 为 45,我们需要从 x 走到 y,最小的步数为:1,2,3,2,2,1,所以我们需要走 6 步。 整数位置 x 为 50,另外一个整数位置 y 为 30,我们需要从 x 走到 y,最小的步数为:1,2,3,4,4,3,2,1,所以我们需要走 8 步。 输入格式 输入包含 2 个整数 x,y。(0<=x<=y<2^31)

输出格式 对于每一组数据,输出一行,仅包含一个整数,从 x 到 y 所需最小步数。

输入样例 12 6 34 45 50 30 1 2 3 输出样例 4 6 8

题目解析

位置 x 移动到位置 y,每一步的移动范围是上一步的 -1+0 或 +1,并且首末两步的步长必须是 1。目标是找到从 x 到 y 的最少步数

贪心的思路是前段加速,后段减速。很容易想到速度的总体变化是一个梯形,可以将问题转化为计算从 0 到 |y - x| 的最少步数,在最后一步的时候记录相对的速度来判断相遇时是否可以一步完成。 分析 为了更好地理解问题,我们可以将其分解为几个部分:

步长变化:每一步的步长只能是上一步的 -1、+0 或 +1。 第一步和最后一步:第一步和最后一步的步长必须是 1。 最小步数:我们需要找到从 x 到 y 的最小步数。 解决方案 我们可以通过以下步骤来解决这个问题:

#include <cmath>
int digui(int distance,int x_step,int y_step)
{
    // std::cout<<distance<<' '<<x_step<<' '<<y_step<<std::endl;
    if(x_step + y_step ==distance || x_step + y_step + 1 == distance || x_step + y_step + 2 == distance)
    {
        return 2;
    }
    else if(x_step == distance||y_step == distance || x_step == distance - 1 || y_step == distance - 1)
        return 1;
    if(x_step + y_step < distance)
    {
        ++x_step;
        ++y_step;
    }
    // std::cout<<distance<<' '<<x_step<<' '<<y_step<<std::endl;

    return 2 + digui(distance -x_step - y_step , x_step, y_step);
}
int solution(int xPosition, int yPosition) {
    // Please write your code here
    // return digui(std::abs(xPosition - yPosition),0,0);
    int D = std::abs(xPosition - yPosition);
    int steps = 0;
    int sum = 0;

    while (sum < D || (sum - D) % 2 != 0) {
        steps++;
        sum += steps;
    }

    return steps+1;
}


int main() {
    //  You can add more test cases here
    std::cout << (solution(12, 6) == 4) << std::endl;
    std::cout << (solution(34, 45) == 6) << std::endl;
    std::cout << (solution(50, 30) == 8) << std::endl;
    return 0;
}

工具运用

可以采用AI的大思路,实际的代码细节需要自己完成。一开始写这题被卡了好久。