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
-
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
-
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.