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

C++でKに最も近いサブ配列のビットごとのAND


この問題では、サイズnと整数kの配列arr[]が与えられます。私たちのタスクは、インデックスiからjまでのサブ配列を見つけて、そのすべての要素のビットごとのANDを計算することです。この後、abs(K-(サブ配列のビットごとのAND))の最小値を出力します。

問題を理解するために例を見てみましょう

入力 − arr [] ={5、1}、k =2

出力

この問題を解決するには、いくつかの方法があります。

簡単な解決策の1つは、直接法を使用することです。すべてのサブ配列のビットごとのANDを見つけてから、|K-X|を見つけます。

ステップ1 −すべてのサブ配列のビットごとのANDを見つけます。

ステップ2 −上記のステップ1で見つかった値ごとに(たとえばX)。 | k--X|の値を見つけます。

ステップ3 −上記の最小値を最小変数に格納します。

ステップ4 −最後に、分を印刷します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int CalcBitwiseANDClosestK(int arr[], int n, int k){
   int minimum = 1000;
   for (int i = 0; i < n; i++) {
      int X = arr[i];
      for (int j = i; j < n; j++) {
         X &= arr[j];
         minimum = min(minimum, abs(k - X));
      }
   }
   return minimum;
}
int main() {
   int arr[] = { 1, 6 , 4, 9, 7 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 5;
   cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k);
   return 0;
}

出力

Minimum value difference between Bitwise AND of sub-array and K is 1

別の解決策は、サブ配列のAND演算を監視することです。ビット単位のANDには、決して増加しないという特性があります。したがって、X≤Kのときに増加する最小の差をチェックする必要があります。

#include <iostream>
using namespace std;
int CalcBitwiseANDClosestK(int arr[], int n, int k){
   int minimum = 1000000;
   for (int i = 0; i < n; i++) {
      int BitwiseAND = arr[i];
      for (int j = i; j < n; j++) {
         BitwiseAND &= arr[j];
         minimum = min(minimum, abs(k - BitwiseAND));
         if (BitwiseAND <= k)
            break;
      }
   }
   return minimum;
}
int main() {
   int arr[] = {1, 6 , 4, 9, 7 };
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 5;
   cout<<"Minimum value difference between Bitwise AND of sub-array and K is "<<CalcBitwiseANDClosestK(arr, n, k);
   return 0;
}

出力

Minimum value difference between Bitwise AND of sub-array and K is 1

  1. C++で重複する円と長方形

    (radius、xc、yc)として表される円があると仮定します。ここで、(xc、yc)は円の中心座標です。また、(x1、y1、x2、y2)として表される軸に沿った長方形があります。ここで、(x1、y1)は左下隅の座標であり、(x2、y2)は右上隅の座標です。長方形の角。円と長方形が重なっていないか確認する必要があります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 関数eval()を定義します。これには、a、b、c、が必要です。 bの最大値とaとcの最小値を返します メインの方法から、次のようにしま

  2. C++でのDominoとTrominoのタイリング

    ドミノとトロミノの2種類の形状があるとします。以下のように回転させることができます- タイリングでは、すべての正方形をタイルで覆う必要があります。ここで、2つのタイルは、ボード上に2つの4方向に隣接するセルがあり、タイルの1つだけが両方の正方形をタイルで占めている場合にのみ異なります。 Nが与えられた場合、2xNボードをタイリングできる方法をいくつ見つける必要がありますか?したがって、入力が3の場合、出力は5になります。したがって、配置は[XYZ XXZ XYYXXYXYY]と[XYZYYZXZZ XYY XXY]になります。ここでは、タイルごとに異なる文字が使用されます。 これを