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

合計がsとなる配列の最大中央値を求めるC++プログラム

問題概要

2つの整数 ns が与えられます。要素の合計がちょうど s と等しくなるような、n 個の非負の要素からなる配列を考えたとき、その中央値として実現可能な最大値を求めます。

例えば、入力が n = 3s = 5 の場合、出力は 2 になります。これは、配列 [1, 2, 2] を考えると、合計が 5 で中央値が 2 となり、これより大きい中央値は実現できないからです。

解法のアプローチ

この問題は、次の手順で解くことができます。

  • 配列を昇順に並べたとき、中央値より前に位置する下位 n / 2 個の要素は、すべて 0 にしても構いません。
  • すると、残りの合計 s を中央値以降の (n / 2) + 1 個の要素で均等に分け合うのが最適な戦略になります。
  • したがって、答えは sm = (n / 2) + 1 で割った商(小数点以下切り捨て)となります。
m := (n / 2) の切り捨て + 1
return (s / m) の切り捨て

C++での実装例

以下の実装を見ると、理解がさらに深まるでしょう。

#include <bits/stdc++.h>
using namespace std;

int solve(int n, int s) {
    int m = n / 2 + 1;
    return s / m;
}
int main() {
    int n = 3;
    int s = 5;
    cout << solve(n, s) << endl;
}

入力

3, 5

出力

2

まとめ

このアルゴリズムの計算量は O(1) と非常に効率的です。ポイントは、「中央値より小さい側の要素を極力小さくし、余った合計を中央値以上の要素に均等に振り分ける」という発想です。整数除算が自動的に切り捨てを行う性質を活かすことで、シンプルな割り算だけで最大の中央値を求められるのが魅力です。

  1. C++で二分木の最大レベル和を求める方法

    問題概要 この問題では、正と負の値を含む二分木が与えられます。私たちのタスクは、二分木におけるレベル和の最大値を見つけることです。 問題の説明: 与えられた二分木に対して、各レベルに存在するすべてのノードの値の合計を計算し、その中で最も大きい値を返します。 具体例を使って問題を理解しましょう。 入力: 出力: 5 説明: レベル1の要素の合計:3 レベル2の要素の合計:-3 + 4 = 1 レベル3の要素の合計:5 - 1 + 6 - 5 = 5 各レベルの合計は「3」「1」「5」となるため、最大のレベル和は 5 となります。 解法アプローチ この問題を効率的に解くには、レベル順走査(幅優先

  2. 2つの異なる配列に格納された要素の中央値を求めるC++プログラム

    本記事では、2つの異なる配列に格納された要素の中央値(メジアン)を求めるC++プログラムについて解説します。両方の配列が同じ要素数 n を持つ場合、マージ処理を行わずに中央位置の2つの値だけを追跡することで、効率よく中央値を計算できます。アルゴリズム基本的な考え方は次のとおりです。両配列の先頭から順に小さい方の要素を比較しながら読み進め、全体で中央にあたる2つの値(n1 と n2)を記録していきます。最後にその平均を返すことで中央値が得られます。Begin 関数 Median() は、配列 a1[]、a2[] および要素数 n を引数として受け取る: i と j を 0 で、n