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

C++で配列のビットごとのORを最大化する


問題の説明

N個の整数の配列が与えられます。配列のすべての要素のビットごとのORは、1つのタスクを実行することによって最大化する必要があります。タスクは、配列の任意の要素に、指定された整数x

を最大k回乗算することです。

入力配列が{4、3、6、1}、k =2、x =3の場合、取得できる最大値は55

です。

アルゴリズム

1. multiply an array element with (x^k) and do bitwise OR it with the bitwise OR of all previous elements
2. Multiply an array element with bitwise OR of all next elements
3. Return the maximum value after all iterations

#include <bits/stdc++.h>
using namespace std;
int getMaxOr(int *arr, int n, int k, int x){
   int prefixSum[n + 1];
   int suffixSum[n + 1];
   int power = 1;
   for (int i = 0; i < k; ++i) {
      power = power * x;
   }
   prefixSum[0] = 0;
   for (int i = 0; i < n; ++i) {
      prefixSum[i + 1] = prefixSum[i] | arr[i];
   }
   suffixSum[n] = 0;
   for (int i = n - 1; i >= 0; --i) {
      suffixSum[i] = suffixSum[i + 1] | arr[i];
   }
   int result = INT_MIN;
   for (int i = 0; i < n; ++i) {
      result = max(result, prefixSum[i] | (arr[i] * power) | suffixSum[i + 1]);
   }
   return result;
}
int main(){
   int arr[] = {4, 3, 6, 1};
   int n = sizeof(arr) / sizeof(arr[0]);
   int k = 2;
   int x = 3;
   cout << "Result = " << getMaxOr(arr, n, k, x) << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Result = 55

  1. C++で配列を反転します

    この記事では、C ++コーディングを使用して、配列を降順で反転する方法を紹介しています。この場合、ループ内で配列をトラバースすることにより、最高のインデックスが最低のインデックスにスワップされます。 例 #include <iostream> #include <algorithm> using namespace std; void reverseArray(int arr[], int n){    for (int low = 0, high = n - 1; low < high; low++, high--){   &nbs

  2. C ++を使用して、配列内の数値の頻度を見つけます。

    配列があるとします。 n個の異なる要素があります。配列内の1つの要素の頻度を確認する必要があります。 A =[5、12、26、5、3、4、15、5、8、4]とすると、5の頻度を見つけようとすると、3になります。 これを解決するために、左から配列をスキャンします。要素が指定された数と同じである場合は、カウンターを増やします。それ以外の場合は、配列がなくなるまで次の要素に進みます。 例 #include<iostream> using namespace std; int countElementInArr(int arr[], int n, int e) {   &nbs