查找在C ++中无限行达到目标的最小移动

假设我们在无限数行中有一个数字位置。(从-inf到+ inf)。从0开始,我们必须按 移动到目标。在第i步中,我们可以向左或向右移动。我们必须找到所需的最小移动量。假设目标为2,则最小步长为3。从0到1,从1到-1和从-1到2。

为了解决这个问题,我们要记住一些重要的观点。如果目标为负,则将其视为正,因为数字行相同。为了解决问题,想法是尽可能地朝一个方向发展。因此,从0到1,从1到3(1 + 2),从3到6(1 + 2 + 3),依此类推。因此,如果在第n次移动之后找到了目标,则只需返回移动次数。但是,如果基础要大于目标,那么我们就必须找出我们前进的差距。现在我们可以看到,如果将第i步向后移动,则总和为(sum – 2i)。现在,如果sum-2i是目标,那么我们得到了结果。但是差异可以是偶数或奇数。对于偶数,返回n作为结果,否则,我们又走了一步。因此,将n + 1相加,然后再次求和。如果n + 1是目标,则返回,

示例

#include<iostream>
#include<cmath>
using namespace std;
int minStepToTarget(int target) {
   target = abs(target);
   int sum = 0, min_step = 0;
   while (sum < target || (sum - target) % 2 != 0) {
      min_step++;
      sum += min_step;
   }
   return min_step;
}
int main() {
   int target = 11;
   cout << "Minimum step to reach the target is: " << minStepToTarget(target);
}

输出结果

Minimum step to reach the target is: 5
猜你喜欢