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