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

C++で勝者を予測する


非負の整数であるスコアの配列があるとします。最初のプレーヤーは、配列のいずれかの端から番号の1つを選択し、次に2番目のプレーヤー、次に最初のプレーヤーというように選択します。プレーヤーが番号を選択するたびに、その番号は他のプレーヤーが利用できなくなります。これは、すべてのスコアが選択されるまで続きます。最大スコアを獲得したプレイヤーが勝ちます。したがって、スコア配列がある場合は、プレーヤー1が勝者であるかどうかを予測する必要があります。

したがって、入力が[1、5、233、7]の場合、最初のプレーヤーが1を選択したため、出力はTrueになります。次に、2番目のプレーヤーは5から7のいずれかを選択する必要があります。プレーヤーが選択すると、最初のプレーヤーは233を選択できます。最後に、最初のプレーヤーは2番目のプレーヤー(12)よりもスコア(234)が多いため、最初のプレーヤーが勝つことができるため、trueを返す必要があります。

これを解決するには、次の手順に従います-

  • nが1と同じ場合、-

    • trueを返す

  • サイズがnxnのアレイplayer1、サイズn x nのアレイplayer2、およびサイズnxnの合計を定義します。

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • player1 [i、j]:=-1

      • player2 [i、j]:=-1

  • 初期化i:=0の場合、i

    • 初期化j:=iの場合、j

      • iがjと同じ場合、-

        • sum [i、j]:=arr [i]

      • それ以外の場合

        • sum [i、j]:=arr [j] + sum [i、j-1]

  • 長さの初期化:=1の場合、長さ<=nの場合、更新(長さを1増やします)、実行-

    • 初期化i:=0の場合、i+長さ-1

      • 終了:=i+長さ-1

      • i + 1 <=終了の場合、-

        • player1 [i、end]:=最大arr [i] +((player2 [i + 1、end]が-1と同じ場合は0、それ以外の場合はplayer2 [i + 1、end]))およびarr [end ] +((player2 [i、end-1]が-1と同じ場合、それ以外の場合、player2 [i、end-1]))

      • それ以外の場合

        • player1 [i、end]:=arr [i]

      • player2 [i、end]:=sum [i、end]-player1 [i、end]

  • player1 [0、n --1]> =player2 [0、n -1]の場合はtrueを返し、それ以外の場合はfalseを返します

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
   lli solve(vector <int> arr, lli n){
      if (n == 1)
         return true;
      lli player1[n][n], player2[n][n], sum[n][n];
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            player1[i][j] = -1;
            player2[i][j] = -1;
         }
      }
      for (int i = 0; i < n; i++) {
         for (int j = i; j < n; j++) {
            if (i == j) {
               sum[i][j] = arr[i];
            }
            else {
               sum[i][j] = arr[j] + sum[i][j - 1];
            }
         }
      }
      for (int length = 1; length <= n; length++) {
         for (int i = 0; i + length - 1 < n; i++) {
            lli end = i + length - 1;
            if (i + 1 <= end)
               player1[i][end] = max(arr[i] + (player2[i + 1][end] == -1 ? 0 : player2[i + 1][end]), arr[end] + (player2[i][end - 1] == -1 ?: player2[i][end - 1]));
            else
               player1[i][end] = arr[i];
               player2[i][end] = sum[i][end] - player1[i][end];
            }
         }
         return player1[0][n - 1] >= player2[0][n - 1];
      }
      bool PredictTheWinner(vector<int>& nums) {
         return solve(nums, nums.size()) ;
   }
};
main(){
   Solution ob;
   vector<int> v = {1, 5, 233, 7};
   cout << (ob.PredictTheWinner(v));
}

入力

{1, 5, 233, 7}

出力

1

  1. C++の迷路

    空のスペースと壁のある迷路の中にボールがあるとします。これで、ボールは上、下、左、右などの任意の方向に転がることで空のパスを通過できますが、壁にぶつかるまで転がりが止まりません。ボールが止まると、次の方向を選択できます。 ボールの位置、目的地、迷路を開始し、ボールが目的地に止まるかどうかを確認する必要があります。迷路は1つの2D配列で表されます。ここで、1は壁を示し、0は空きスペースを示します。迷路の境界はすべて壁です。開始座標と宛先座標は、行と列のインデックスで表されます。 したがって、入力が2D配列で表される迷路のようなものである場合 0 0 1 0 0

  2. C++のMazeIII

    空のスペースと壁のある迷路があり、その迷路の中にボールもあるとします。ボールは、上(u)、下(d)、左(l)、または右(r)の方向に転がることで空きスペースを通過できますが、壁にぶつかるまで転がり続けます。ボールが止まると、次の方向を選ぶことができます。その迷路にも1つの穴があります。ボールが穴に転がると、ボールは穴に落ちます。 したがって、ボールの位置、穴の位置、迷路がある場合、最短距離を移動することでボールがどのように穴に落ちるかを調べる必要があります。ここで、距離は、ボールがスタート(除外)からホール(含まれる)まで移動した空きスペースの数によって定義されます。 「u」、「d」、「l