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

C++で配列のXORをゼロにするための最小演算


問題の説明

n個の要素の配列が与えられます。タスクは、配列全体のXORを0にすることです。これを実現するには、次のようにします。

要素のいずれかを選択できます-

  • 要素を選択した後、要素を1ずつインクリメントまたはデクリメントできます。
  • 配列全体のXOR合計をゼロにするために、選択した要素に必要なインクリメント/デクリメント操作の最小数を見つける必要があります

arr [] ={2、4、7}の場合、1回の操作が必要です-

  • 要素2を選択
  • 1つ減らします
  • 配列は{3、4、7}になり、そのXORは0になります

アルゴリズム

  • アレイ全体のXORを見つける
  • ここで、要素arr [i]を選択したとすると、その要素に必要なコストは絶対になります(arr [i]-(XORsum ^ arr [i]))
  • 各要素のこれらの絶対値の最小値を計算することが、最低限必要な操作になります

#include <iostream>
#include <climits>
#include <cmath>
using namespace std;
void getMinCost(int *arr, int n) {
   int operations = INT_MAX;
   int elem;
   int xorValue = 0;
   for (int i = 0; i < n; ++i) {
      xorValue = xorValue ^ arr[i];
   }
   for (int i = 0; i < n; ++i) {
      if (operations > abs((xorValue ^ arr[i]) - arr[i])) {
         operations = abs((xorValue ^ arr[i]) - arr[i]);
         elem = arr[i];
      }
   }
   cout << "Element= " << elem << endl;
   cout << "Minimum required operations = " << abs(operations) << endl;
}
int main() {
   int arr[] = {2, 4, 7};
   int n = sizeof(arr) / sizeof(arr[0]);
   getMinCost(arr, n);
   return 0;
}

出力

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

Element = 2
Minimum required operations = 1

  1. C++で互いに素な配列を作成するための最小限の挿入

    このセクションでは、別の興味深い問題が発生します。 N個の要素の配列があるとします。この配列を互いに素な配列にするためには、交点の最小数を見つける必要があります。互いに素な配列では、2つの連続する要素ごとのgcdは1です。配列も印刷する必要があります。 {5、10、20}のような要素があるとします。これは互いに素な配列ではありません。ここで、5、10、10、20の間に1を挿入すると、互いに素な配列になります。したがって、配列は{5、1、10、1、20}のようになります。 アルゴリズム makeCoPrime(arr, n): begin    count := 0 &nb

  2. C++で配列のすべての要素を同じにするための最小限の削除操作。

    問題の説明 要素が繰り返されるようなn個の要素の配列が与えられます。配列から任意の数の要素を削除できます。タスクは、配列から削除する要素の最小数を見つけて、配列を等しくすることです。 arr[] = {10, 8, 10, 7, 10, -1, -4, 12} すべての配列要素を同じにするには、強調表示された5つの要素を削除する必要があります。 アルゴリズム 1. Count frequency of each element 2. Find maximum frequecy among the frequencies. Let us call this as maxFrequncy 3.