C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

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を返します。それ以外の場合は、もう1つの手順を実行します。したがって、合計にn + 1を加算して、再び差を取ります。 n + 1がターゲットの場合は戻り、それ以外の場合はn+2でもう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

  1. C++で線の中点を見つけるプログラム

    この問題では、線の始点と終点の2つの点AとBが与えられます。私たちの仕事は、C++で線の中点を見つけるプログラムを作成することです。 問題の説明 −ここでは、開始点と終了点がA(x1、y1)とB(x2、y2)の線があります。そして、線の中点を見つける必要があります。 問題を理解するために例を見てみましょう 入力 a(x1, y1) = (4, -5) b(x2, y2) = (-2, 6) 出力 (1, 0.5) 説明 (x1 + x2)/2 = 4 - 2 / 2 = 1 (y1 + y2)/2 = -5 + 6 / 2 = 0.5 ソリューションアプローチ この問題を解決する

  2. C++での最小の騎士の動き

    座標が-無限大から+無限大までの無限のチェス盤があり、正方形[0、0]に騎士がいるとします。騎士は、以下に示すように、8つの可能な動きをすることができます。それぞれの動きは、基本方向に2マス、次に直交方向に1マスです。 騎士を正方形[x、y]に移動するために必要な最小ステップ数を見つける必要があります。答えが存在することが保証されています。 したがって、入力がx=5およびy=5の場合、出力は4になります。これは[0,0]→[2,1]→[4,2]→[3,4]→[のようになります。 5,5] これを解決するには、次の手順に従います- マップを定義するm Solve()とい