📜  找出在无限线上达到目标的最小移动

📅  最后修改于: 2021-05-07 00:44:44             🧑  作者: Mango

给定无限线上的目标位置,即-infinity到+ infinity。从表格0开始,您必须按如下所述通过移动来达到目标:在第一种移动中,您可以向前或向后迈出i步。找到达到目标所需的最小移动量。
例子 :

Input : target = 3
Output : 2
Explanation:
On the first move we step from 0 to 1.
On the second step we step from 1 to 3.

Input: target = 2
Output: 3
Explanation:
On the first move we step from 0 to 1.
On the second move we step  from 1 to -1.
On the third move we step from -1 to 2.

我们在下面的文章中讨论了一个幼稚的递归解决方案。
到达目的地的最少步骤
如果目标为负,则可以将其视为正,因为我们以对称方式从0开始。
想法是尽可能向一个方向移动,这将使移动最小化。从0开始,第一步将我们带到1,第二步将我们带到3(1 + 2)位置,第三步将我们带到6(1 + 2 + 3)位置,依此类推;因此,为了找到目标,我们继续添加动作,直到找到第n个动作,使得1 + 2 + 3 +…+ n> = target。现在,如果总和(1 + 2 + 3 +…+ n)等于目标,我们的工作就完成了,即,我们需要n步才能达到目标。现在,下一个总和大于目标的情况。通过我们领先多少,即总和目标,找到差异。设差为d =总和–目标。
如果我们向后移动第i个,则新的总和将变为(sum – 2i),即1 + 2 + 3 +…-x + x + 1…+ n。现在,如果sum-2i = target,那么我们的工作就完成了。由于sum – target = 2i,即相差应该是偶数,因为我们将得到一个整数i翻转,它将给出答案。因此出现以下情况。
情况1:差异是偶数,答案是n(因为我们总是会碰到目标,因此会产生翻转)。
情况2:差是奇数,那么我们又迈出了一步,即将n + 1相加,然后再次求差。如果答案是n + 1,那么答案是n + 2。
说明:由于差异是奇数。目标是奇数或偶数。
情况1:n为偶数(1 + 2 + 3 +…+ n),然后加n + 1会使差为偶数。
情况2:n为奇数,那么即使再加上n + 1也无济于事,所以我们还得再走一步,所以n + 2。
例子:
目标= 5。
我们会不断采取行动,直到达到目标或我们越过目标为止。
总和= 1 + 2 + 3 = 6> 5,步长= 3。
差= 6 – 5 =1。由于差是一个奇数值,因此我们无法通过将+ i的任何移动翻转到-i来达到目标。因此,我们增加了一步。我们需要将步长增加2以获得偶数差(因为n为奇数,而目标也为奇数)。现在我们有了一个均匀的差,只要改变值的总和等于差的一半,我们就可以简单地将任何移动向左移动(即,将+更改为-)。我们可以切换1和4或2和3或5。

C++
// CPP program to find minimum moves to
// reach target if we can move i steps in
// i-th move.
#include 
using namespace std;
 
int reachTarget(int target)
{
    // Handling negatives by symmetry
    target = abs(target);
     
    // Keep moving while sum is smaller or difference
    // is odd.
    int sum = 0, step = 0;
    while (sum < target || (sum - target) % 2 != 0) {
        step++;
        sum += step;
    }
    return step;
}
 
// Driver code
int main()
{
    int target = 5;
    cout << reachTarget(target);
    return 0;
}


Java
// Java program to find minimum 
//moves to reach target if we can
// move i steps in i-th move.
import java.io.*;
import java.math.*;
 
class GFG {
     
    static int reachTarget(int target)
    {
        // Handling negatives by symmetry
        target = Math.abs(target);
         
        // Keep moving while sum is smaller
        // or difference is odd.
        int sum = 0, step = 0;
         
        while (sum < target || (sum - target) % 2
                                        != 0) {
            step++;
            sum += step;
        }
        return step;
    }
     
    // Driver code
    public static void main(String args[])
    {
       int target = 5;
       System.out.println(reachTarget(target));
    }
}
 
// This code is contributed by Nikita tiwari.


Python 3
# Python 3 program to find minimum 
# moves to reach target if we can
# move i steps in i-th move.
 
 
def reachTarget(target) :
 
    # Handling negatives by symmetry
    target = abs(target)
     
    # Keep moving while sum is
    # smaller or difference is odd.
    sum = 0
    step = 0
    while (sum < target or (sum - target) %
                                  2 != 0) :
        step = step + 1
        sum = sum + step
     
    return step
     
 
# Driver code
target = 5
print(reachTarget(target))
 
 
# This code is contributed by Nikita Tiwari


C#
// C# program to find minimum
//moves to reach target if we can
// move i steps in i-th move.
using System;
 
class GFG {
     
    static int reachTarget(int target)
    {
        // Handling negatives by symmetry
        target = Math.Abs(target);
         
        // Keep moving while sum is smaller
        // or difference is odd.
        int sum = 0, step = 0;
         
        while (sum < target ||
              (sum - target) % 2!= 0)
        {
            step++;
            sum += step;
        }
        return step;
    }
     
    // Driver code
    public static void Main()
    {
    int target = 5;
    Console.WriteLine(reachTarget(target));
    }
}
 
// This code is contributed by vt_m.


PHP


Javascript


输出 :

5