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

C++の配列内のペアの最大ビット単位AND値


問題の説明

n個の正の要素の配列が与えられます。配列から要素の任意のペアによって生成された最大ビット単位のAND値を見つける必要があります。

入力配列が{10、12、15、18}の場合、ビット単位のANDの最大値は12です。

アルゴリズム

単一ビットに対するビット単位のAND演算の結果は、両方のビットが1のときに最大になります。このプロパティを考慮すると-

  • MSBから開始して、設定値を持つ配列の要素が2つ以上あるかどうかを確認します
  • はいの場合、そのMSBはソリューションの一部になり、結果に追加されます。そうでない場合は、そのビットを破棄します
  • 同様に、ビット位置をMSBからLSB(32から1)に繰り返すと、どのビットがソリューションの一部になるかを簡単に確認でき、そのようなすべてのビットをソリューションに追加し続けます。

例を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
int checkBits(int *arr, int n, int pattern) {
   int cnt = 0;
   for (int i = 0; i < n; ++i) {
      if ((pattern & arr[i]) == pattern) {
         ++cnt;
      }
   }
   return cnt;
}
int getMaxBitwiseAnd(int *arr, int n) {
   int result = 0;
   int count;
   for (int i = 31; i >= 0; --i) {
      count = checkBits(arr, n, result | (1 << i));
      if (count >= 2) {
         result |= (1 << i);
      }
   }
   return result;
}
int main() {
   int arr[] = {10, 12, 15, 18};
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Maximum bitwise AND = " << getMaxBitwiseAnd(arr, n) << endl;
   return 0;
}

出力

Maximum bitwise AND = 12

  1. | ai + aj –k|の可能な最小値C++で指定された配列とkに対して

    問題の説明 n個の整数と整数Kの配列が与えられます。|ai+ aj – k|の絶対値となるような順序付けされていないペアの総数{i、j}を見つけます。 i!=jの場合は最小限に抑えられます。 例 arr [] ={0、4、6、2、4}およびk =7の場合、最小値を1として次の5つのペアを作成できます {0、6}、{4、2}、{4、4}、{6、2}、{2、4} アルゴリズム 可能なすべてのペアを反復処理し、各ペアについて、(ai + aj – K)の値が現在の最小値であるnotよりも小さいかどうかを確認します。したがって、上記の条件の結果として、合計3つのケースがあります- 最小-こ

  2. C++の配列で最大GCDのペアを検索します

    正の整数の配列があるとします。私たちのタスクは、GCD値が最大である配列から整数のペアを見つけることです。 A ={1、2、3、4、5}とすると、出力は2になります。ペア(2、4)にはGCD 2があり、他のGCD値は2未満です。 この問題を解決するために、各要素の除数の数を格納するためのカウント配列を維持します。除数を数えるプロセスには、O(sqrt(arr [i]))の時間がかかります。全体をトラバースした後、最後のインデックスから最初のインデックスまでカウント配列をトラバースできます。要素が1より大きい値が見つかった場合、これは2つの要素の約数であり、最大GCDでもあることを意味します。