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

C++ですべての配列要素を等しくするために必要な最小操作回数を求める方法


問題文

n 個の正の整数からなる配列が与えられます。すべての要素を等しくするために必要な最小の操作回数を求めてください。1 回の操作では、配列内の任意の要素に対して、加算・乗算・減算・除算のいずれかを行うことができます。

入力配列が {1, 2, 3, 4} の場合、すべての要素を等しくするには最小で 3 回の操作が必要です。たとえば、要素 1 に対して 3 回の加算を行えば、すべての要素を 4 に揃えることができます。

アルゴリズム

  1. 最も出現回数(頻度)が多い要素を選びます。これを「x」と呼びます。
  2. 同じ値の要素がすでに x 個存在するため、残りの n − x 個の要素に対して操作を行えばよいことになります。したがって、必要な最小操作回数は n − x 回です。

このアプローチの計算量は、ハッシュマップを用いて各要素の頻度を数えるため、時間計算量 O(n)、空間計算量 O(n) となります。

実装例

#include <bits/stdc++.h>
using namespace std;
int getMinOperations(int *arr, int n) {
    unordered_map<int, int> hash;
    for (int i = 0;i < n; ++i) {
        hash[arr[i]]++;
    }
int maxFrequency = 0;
    for (auto elem : hash) {
        if (elem.second > maxFrequency) {
            maxFrequency = elem.second;
        }
    }
    return (n - maxFrequency);
}
int main() {
    int arr[] = {1, 2, 3, 4};
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << "Minimum required operations = " <<
    getMinOperations(arr, n) << endl;
    return 0;
}

上記のプログラムをコンパイルして実行すると、次の出力が得られます。

出力

Minimum required operations = 3

  1. C++で配列内の指定した数Kで割り切れる要素の積を求める方法

    整数がn個格納された配列arr[n]と整数kが与えられたとき、配列arr[]の中でkで割り切れるすべての要素の積を求めるのがこの問題の目的です。この問題を解くには、配列の各要素を先頭から順に走査し、その要素がkで完全に割り切れるかどうかを判定します。割り切れた要素はすべて掛け合わせ、その結果を変数に格納していきます。例えば、配列arr[] = {1, 2, 3, 4, 5, 6}、k = 2が与えられた場合、2で割り切れる要素は2、4、6の3つであり、それらの積は48となります。それでは、入力に対してどのような出力が期待されるのか、具体例で確認してみましょう。入力arr[] = {10, 11

  2. C++で無向グラフの連結成分ごとの最小要素の合計を求める方法

    この記事では、無向グラフのすべての連結成分に含まれる最小要素の合計を求める問題を、C++を使って解く方法を解説します。 問題の設定は次のとおりです。N個の整数からなる配列 arr が与えられ、arr[i] は (i+1) 番目のノードの値を表します。また、M個の辺のペア (u, v) が与えられ、それぞれノード u とノード v が辺で結ばれていることを示します。このとき、無向グラフの各連結成分ごとに最小値を求め、それらをすべて合計した値を出力するプログラムを作成します。なお、他のどのノードともつながっていないノードは、それ単独で1つの連結成分として扱います。 問題例 具体的な入力例で問題を確