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

XORされた合計の可能な最大値を見つけるためのC++プログラム


N個の要素と別の値Kを持つ配列Aがあるとします。0からKの範囲の整数Xの場合、f(X)=(X xor A [1])+(X xor A [2])+.。 。+(X xor A [N])。 fの可能な最大値を見つける必要があります。

したがって、入力がK=7のような場合。 A =[1、6、3]の場合、f(4)=(4 XOR 1)+(4 XOR 6)+(4 XOR 3)=5 + 2 + 7 =14. <であるため、出力は14になります。 / P>

ステップ

これを解決するには、次の手順に従います-

n := size of A
for initialize i := 45, when i >= 0, update (decrease i by 1), do:
   p := 2^i
   m := 0
   for initialize j := 0, when j < n, update (increase j by 1), do:
      if A[j] AND p is non-zero, then:
         (increase m by 1)
   if o + p <= k, then:
      if m < n - m, then:
         m := n - m
         o := o + p
   d := d + p * m
return d

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;

long solve(int k, vector<int> A){
   long n = A.size(), d = 0, m, p, o = 0;
   for (long i = 45; i >= 0; i--){
      p = pow(2, i);
      m = 0;
      for (int j = 0; j < n; j++){
         if (A[j] & p)
            m++;
      }
      if (o + p <= k){
         if (m < n - m){
            m = n - m;
            o += p;
         }
      }
      d += p * m;
   }
   return d;
}
int main(){
   int K = 7;
   vector<int> A = { 1, 6, 3 };
   cout << solve(K, A) << endl;
}

入力

7, { 1, 6, 3 }

出力

14

  1. C++のバイナリツリーで最大レベルの合計を見つける

    この問題では、正と負の値を持つ二分木が与えられます。私たちのタスクは、バイナリツリーで最大レベルの合計を見つけることです。 問題の説明: 二分木があります。二分木のすべてのレベルの合計を見つけて、それらの最大値を返します。 問題を理解するために例を見てみましょう 入力: 出力: 5 説明: レベル1:3の要素の合計 レベル2の要素の合計:-3 + 4 =1 レベル3の要素の合計:5 --1 + 6-5 =5 ソリューションアプローチ この問題を解決するには、レベル順トラバーサルを使用してツリーをトラバースする必要があります。そして、レベルごとに、合計

  2. Pythonで最小グループの可能な最大値を見つけるプログラム

    numsと呼ばれる数値のリストと別の値kがあるとします。リストをk個の連続したグループに分割する必要があります。最小のグループは、すべてのグループの中で合計が最小のグループです。したがって、最小のグループの可能な最大値を見つけます。 したがって、入力がnums =[2、6、4、5、8] k =3のような場合、リストを[2、6]、[4]のように3つのグループに分割できるため、出力は8になります。 、5]、[8]。したがって、最小グループの合計は8になります。 これを解決するには、次の手順に従います- 関数is_divisible()を定義します。これはターゲットになります ターゲ