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

C++での黒板XORゲーム


numsという配列があり、nums[i]が黒板に書かれているとします。ラムとサムは交代で黒板から正確に1つの要素を消去し、ラムが最初に開始します。数字を消去すると、黒板のすべての要素のビット単位のXORが0になる場合、そのプレーヤーは負けます。 1つの要素のビット単位のXORはその要素自体であり、要素のないビット単位のXORは0です。いずれかのプレーヤーが黒板のすべての要素のビット単位のXORが0に等しい状態でターンを開始すると、そのプレーヤーが勝ちます。配列が[1、2、1]を保持しているとすると、Ramは1または2を削除できます。Ramが1を削除すると、配列は[2,1]になります。これは、要素1のXOR XOR 2 =3であり、Samはすべての要素を削除します。これは、Ramが最後の要素を消去するものであり、彼が失うためです。最初に2を削除することを選択した場合、配列は[1,1]になり、XORは0になるため、Ramは失われます。

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

  • n:=numsのサイズ
  • x:=0
  • すべての要素iのnums-
    • x:=x XOR i
  • return xは0と同じか、nmod2は0です

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   bool xorGame(vector<int>& nums) {
      int n = nums.size();
      int x = 0;
      for(int i : nums) x ^= i;
      return x == 0 || n % 2 == 0;
   }
};
main(){
   Solution ob;
   vector<int> v = {1,2,1};
   cout << (ob.xorGame(v));
}

入力

{1,2,1}

出力

0

  1. C++でゲームIVをジャンプする

    arrという整数の配列があるとします。最初はインデックス0にいます。1つのステップで、インデックスiからi + xにジャンプできます。ここで、i +x =0。jここで:arr[i]とarr[j]は同じであり、iとjは同じではありません。ここで、nは配列のサイズです。配列の最後のインデックスに到達するための最小ステップ数を見つける必要があります。 したがって、入力が次のような場合、 その場合、出力は3になります。インデックス0から4、3から9への3つのジャンプが必要です。 これを解決するには、次の手順に従います- 1つのマップを定義するm n:=arrのサイズ 初期

  2. C++でゲームVをジャンプする

    arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックスiから-にジャンプできます。 i + xここで、i +x