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

各要素を直前の要素で割った値の配列合計を求めるアルゴリズム

今回は少しユニークな問題を紹介します。ある配列を受け取り、各要素を直前の要素で除算した値の合計を求めるというものです。

例として、配列 {5, 6, 7, 2, 1, 4} を考えてみましょう。この場合、計算結果は次のようになります。

5 + (6 / 5) + (7 / 6) + (2 / 7) + (1 / 2) + (4 / 1) = 12.15238

それでは、この問題を解くための手順を確認していきましょう。

アルゴリズム

divSum(arr, n)

begin
    sum := arr[0]
    for i := 1 to n-1, do
        sum := sum + arr[i] / arr[i-1]
    done
    return sum
end

C++による実装例

#include <iostream>
using namespace std;
float divSum(int arr[], int n){
    float sum = arr[0];
    for(int i = 1; i<n; i++){
        sum += arr[i] / float(arr[i - 1]);
    }
    return sum;
}
int main() {
    int arr[6] = {5, 6, 7, 2, 1, 4};
    int n = 6;
    cout << "Sum : " << divSum(arr, n);
}

出力結果

Sum : 12.1524

コードのポイント

このアルゴリズムのポイントは以下の通りです。

  • 最初の要素 arr[0] には「前の要素」が存在しないため、そのまま合計に加算します。
  • 2番目以降の要素については、直前の要素で割った値を順番に足し合わせていきます。
  • C++では整数同士の除算を行うと小数点以下が切り捨てられてしまうため、float(arr[i - 1]) のように明示的にキャストし、正確な小数計算を実現しています。

計算量は O(n) で、配列を一度走査するだけで答えが求まるため、とても効率的な手法と言えます。

  1. PythonでK回の符号反転後に配列の合計を最大化する

    問題概要 整数の配列 A が与えられます。この配列に対して、次の操作をちょうど K 回行うことを考えます。 任意のインデックス i を選び、A[i] を -A[i] に置き換える(符号を反転する) すべての操作を行ったあとの配列の合計として、考えられる最大値を求めるのがこの問題です。 例: A = [4, 2, 3]、K = 1 の場合、出力は 5 になります。インデックス 1 を選んで反転すると配列は [4, -2, 3] となり、合計は 4 + (-2) + 3 = 5 となるからです。 解法の考え方(貪欲法) この問題は貪欲法で解くのが有効です。基本となる発想は次の通りです。 負

  2. Pythonでクエリ処理後の偶数の合計を効率的に求める方法

    整数の配列 A と、クエリを格納した配列 queries があるとします。i番目のクエリでは、value = queries[i][0]、index = queries[i][1] となり、A[index] に value を加算します。そして、i番目のクエリに対する答えは、更新後の配列 A に含まれる偶数の合計値です。すべてのクエリに対する答えを順番に求め、それらを配列として返すのがこの問題の目的です。問題の例例として、配列が [1,2,3,4]、クエリ配列が [[1,0],[-3,1],[-4,0],[2,3]] の場合を考えてみましょう。このとき、答えの配列は [8,6,2,4] になり