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

C++の整数配列のすべての数とXORするときに最小の合計を与える数を見つけます


コンセプト

非負の整数の与えられた配列Arr[]に関して、タスクは(Arr [0] XOR X)+(Arr [1] XOR X)+…+ Arr [n –1]となる整数Xを決定することです。 XORXは可能な限り最小限です。

入力

Arr[] = {3, 4, 5, 6, 7}

出力

X = 7, Sum = 10

アプローチ

したがって、バイナリ表現で配列のすべての数の「i」番目のビットを検証し、「1」に設定された「i」番目のビットを含む数を検討してカウントします。これらの設定されたビットは、最小化ではなく合計の最大化に寄与するためです。この結果、カウントがN / 2より大きい場合、このセットの「i」番目のビットを「0」に構築する必要があります。カウントがN / 2より小さい場合、「i」番目のビットが設定されている数値は少なくなります。この結果、答えに影響を与えることはありません。 2ビットのXOR演算によれば、A XOR BとAとBの両方が同じである場合、結果は「0」になるため、数値(num)の「i」番目のビットを「1」に構築します。その結果、(1 XOR 1)は「0」を与え、合計を最小化します。

// C++ implementation of the approach
#include <bits/stdc++.h>
#include <cmath>
using namespace std;
void findX1(int arr1[], int n1){
   int* itr1 = max_element(arr1, arr1 + n1);
   int p1 = log2(*itr1) + 1;
   int X1 = 0;
   for (int i = 0; i < p1; i++) {
      int count1 = 0;
      for (int j = 0; j < n1; j++) {
         if (arr1[j] & (1 << i)) {
            count1++;
         }
      }
      if (count1 > (n1 / 2)) {
         X1 += 1 << i;
      }
   }
   long long int sum1 = 0;
   for (int i = 0; i < n1; i++)
      sum1 += (X1 ^ arr1[i]);
   cout << "X = " << X1 << ", Sum = " << sum1;
}
// Driver code
int main(){
   int arr1[] = { 3, 4, 5, 6, 7 };
   int n1 = sizeof(arr1) / sizeof(arr1[0]);
   findX1(arr1, n1);
   return 0;
}

出力

X = 7, Sum = 10

  1. 合計がC++で均等になるように、配列に最小数を追加しますか?

    いくつかの番号を持つ配列があるとします。要素の合計を均等にするために、それに追加される数値の最小数を指定する必要があります。数値は0より大きくなければなりません。したがって、要素の合計が奇数の場合は1を加算しますが、合計がすでに偶数の場合は2を加算して偶数にします。 アルゴリズム addMinNumber(arr) begin    s := 0    for each element e from arr, do       s := e + s    done    if s i

  2. Pythonで整数の配列のすべての数とXORするときに最小の合計を与える数を見つけます

    配列Aがあるとすると、(A [0] XOR X)+(A [1] XOR X)+…+ A [n – 1]XORXが可能な限り最小になるような数Xを見つける必要があります。 したがって、入力が[3、4、5、6、7]の場合、出力はX =7、Sum =10になります。 これを解決するには、次の手順に従います- 関数search_res()を定義します。これには時間がかかります、n 要素:=arr [0] 0からarrのサイズまでの範囲のiについては、 要素の場合、 要素:=arr [i] p:=(要素の底2の対数)+1の整数 X:=0 0からpの範囲のiについては、