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

C++でのエリミネーションゲーム


1からnまでのソートされた整数のリストがあるとします。それは左から始まり右で終わります。リストの最後に到達するまで、最初の番号とその後のすべての番号を削除する必要があります。前の手順をもう一度繰り返しますが、今回は右から左に、残りの番号から右端の番号と1つおきの番号を削除します。 1つの数字が残るまで、左から右、右から左に交互に手順を繰り返します。長さnのリストで始まる最後の番号を見つける必要があります。

したがって、入力がn =9の場合、手順は次のようになります-

  • 1 、2、 3 、4、 5 、6、 7 、8、 9

  • 2、 4 、6、 8

  • 2 、6

  • 6

したがって、答えは6になります。

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

  • 左:=1、ヘッド:=1、ステップ:=1、レム:=n

  • rem> 1

    • leftがゼロ以外の場合、またはremが奇数の場合、head:=head + step

    • ステップ:=ステップ* 2

    • 左:=左の逆

    • rem:=rem / 2

  • リターンヘッド

例(C ++)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int lastRemaining(int n) {
      int head = 1;
      int step = 1;
      int rem = n;
      int left = 1;
      while(rem > 1){
         if(left || rem % 2 == 1){
            head += step;
         }
         step *= 2;
         left = !left;
         rem /= 2;
      }
      return head;
   }
};
main(){
   Solution ob;
   cout << (ob.lastRemaining(9));
}

入力

9

出力

6

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

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

  2. C++での最大二分木

    整数配列があるとします。その配列内のすべての要素は一意です。この配列での最大ツリー構築は、次のように定義されます- ルートは配列内の最大数を保持します。 左側のサブツリーは、サブアレイの左側を最大数で割って構築された最大ツリーです。 右側のサブツリーは、サブアレイの右側を最大数で割って構築された最大ツリーです。 最大の二分木を構築する必要があります。したがって、入力が[3,2,1,6,0,5]の場合、出力は-になります。 これを解決するには、次の手順に従います- Solve()というメソッドを定義します。これにより、リストと左右の値が取得されます。関