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

C++で各放射局の最終的な放射強度を求める方法


直線上にN個の局(ステーション)が並んでおり、それぞれが同じ非負の放射パワーを持っているとします。各局は、自分の放射パワーに応じて、隣接する局の放射パワーを次のルールで増加させます。

例えば、局iの放射パワーがRである場合、(i−1)番目の局の放射パワーを「R−1」だけ、(i−2)番目の局の放射パワーを「R−2」だけ増加させます。同様に、(i+1)番目の局の放射パワーを「R−1」だけ、(i+2)番目の局の放射パワーを「R−2」だけ増加させ、これを繰り返します。つまり、局から離れるほど影響が1ずつ減っていく仕組みです。

計算例

配列が Arr = [1, 2, 3] の場合、出力は 3, 4, 4 になります。新しい放射パワーは次のように計算されます。

[1 + (2 − 1) + (3 − 2), 2 + (1 − 1) + (3 − 1), 3 + (2 − 1)] = [3, 4, 4]

アルゴリズムの考え方

考え方はシンプルです。各局iについて、距離に応じて減衰した実効放射パワーが負になるまで、隣接する局の放射パワーを順に加算していきます。これをすべての局に対して行うことで、各局の最終的な放射パワーを求めることができます。

C++での実装例

#include <iostream>
#include <vector>
using namespace std;

vector<int> finalRadiation(vector<int>& arr, int n) {
    vector<int> result(n, 0);
    for (int i = 0; i < n; i++) {
        // 自分自身の放射パワーを加算
        result[i] += arr[i];
        // 左方向への影響
        for (int j = i - 1, k = 1; j >= 0 && arr[i] - k > 0; j--, k++) {
            result[j] += arr[i] - k;
        }
        // 右方向への影響
        for (int j = i + 1, k = 1; j < n && arr[i] - k > 0; j++, k++) {
            result[j] += arr[i] - k;
        }
    }
    return result;
}

int main() {
    vector<int> arr = {1, 2, 3};
    int n = arr.size();
    vector<int> result = finalRadiation(arr, n);
    for (int x : result) {
        cout << x << " ";
    }
    return 0;
}

出力

3 4 4

計算量について

この実装では、各局ごとに左右両方向の影響を調べるため、時間計算量はO(N²)となります。Nが非常に大きい場合は、差分配列や累積和のテクニックを組み合わせることで、O(N)程度まで高速化することも可能です。

  1. C++で三角形の重心を求めるプログラムの作成方法

    この記事では、三角形の3つの頂点の座標を格納した2次元配列が与えられたときに、その三角形の重心を求めるC++プログラムの作成方法を解説します。 三角形の重心とは、三角形の3本の中線がすべて交わる点のことです。 また、三角形の中線とは、ある頂点と、その対辺(向かい合う辺)の中点を結ぶ線分のことを指します。 それでは、具体的な例を使って問題を確認してみましょう。 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-1.5, -1) 説明 重心 (x, y) = ((-3 + 1.5 - 3) / 3, (1 + 0 - 4) / 3) = (-1.5, -1) 解法のアプロ

  2. C++で平行四辺形の面積を求めるプログラムの作成方法

    この記事では、平行四辺形の底辺と高さを表す2つの値が与えられたとき、C++を使ってその面積を求めるプログラムを作成する方法を解説します。 平行四辺形とは? 平行四辺形とは、4つの辺からなる閉じた図形であり、向かい合う2組の辺がそれぞれ長さが等しく、互いに平行になっている四角形のことです。 問題を理解するための具体例 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積 = 底辺 × 高さ = 20 × 15 = 300 解決アプローチ この問題を解くには、平行四辺形の面積を求める幾何学の公式を使用します。 面積 = 底辺 × 高さ つまり、与えられた底辺と高さを掛け合わせ