C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で行列内の正方形の最大辺の長さを求めるアルゴリズム

    この問題では、サイズ n × n の2次元行列 mat[][] が与えられます(n は奇数)。求めるのは、行列と同じ中心を持ち、外周の値がすべて等しい正方形の最大の辺の長さです。問題の概要与えられた行列の中から、行列の中心を共有する正方形の部分行列を探し、その外周(周囲)を構成する要素がすべて同じ値である場合に、その正方形の辺の長さを返します。条件を満たす複数の正方形がある場合は、最も大きいものを選びます。入力例mat[][] = { {2, 4, 6, 6, 5}, {1, 7, 7, 7, 3}, {5, 7, 0, 7, 1}, {3, 7, 7, 7,

  2. C++で長さm以下となる最大合計部分配列を求めるアルゴリズム

    この問題では、長さの異なる n 個の配列が与えられます。求めるのは、合計長さが m 以下となるように各配列から部分配列を選択し、その要素の合計を最大化することです。つまり、複数の配列の中から部分配列を取り出し、それら全体の合計値を最大化しながら、選んだ部分配列の長さの総和を m 以内に収める必要があります。問題例具体的な入力と出力を見て、問題を理解しましょう。入力n = 3, m = 4 arrOfArr[][] = { {5, 2, -1, 4, -3}, {3, -2, 1, 6}, {-2, 0, 5} }出力20解説選択した部分配列:{5, 4}, {6}, {

  3. 【C++】配列内のK番目ごとの要素を取得したときの最大合計を求める方法

    この記事では、配列 arr[] と整数 k が与えられたとき、「K番目ごとの要素を取得して得られる合計」の最大値を求めるアルゴリズムについて解説します。 問題の概要 配列の要素のうち、インデックスが k ずつ離れている要素だけを選んで合計し、その合計が最大になるようにします。つまり、次の式で表される sum を最大化することが目的です。 sum = arr[i] + arr[i+k] + arr[i+2*k] + … + arr[i+p*k](条件:i + p*k < n) 入出力例 入力: arr[] = {5, 3, −1, 2, 4, −5, 6}, k = 4 出力: 9 説

  4. C++で配列arr[]内のabs(i – j) * min(arr[i], arr[j])の最大値を求める方法

    この問題では、N個の整数値からなる配列 arr[] が与えられます。私たちのタスクは、配列 arr[] 内で abs(i – j) * min(arr[i], arr[j]) の最大値を見つけることです。 問題の説明 ― 2つの要素のうち小さい方の値と、そのインデックス同士の絶対差を掛け合わせた積の最大値を求める必要があります。つまり、2つのインデックス i と j に対して、abs(i - j) * min(arr[i], arr[j]) を最大化するのが目標です。 入力例 arr[] = {5, 7, 3, 6, 4} 出力例 16 説明 最大値は16で、インデックス0と4の組み合わせで

  5. C++で配列の回転のみを許可してSum(i*arr[i])の最大値を求めるアルゴリズム

    問題概要この問題では、n個の要素からなる配列arr[]が与えられます。配列に対しては回転操作のみが許可されており、その条件下でSum(i*arr[i])の最大値を求める必要があります。最大の合計値を見つけるために、回転は何度行っても構いません。例を使って問題を理解しましょう。入力arr[] = {4, 1, 3, 7, 2}出力43説明配列を1回回転すると {2, 4, 1, 3, 7} となり、このとき最大値が得られます。Sum = 0*2 + 1*4 + 2*1 + 3*3 + 4*7 = 0 + 4 + 2 + 9 + 28 = 43解法アプローチ最も単純な解法は、配列をn回回転させ、各

  6. C++で整数ストリームから指定した整数との最大XORを求める方法

    この問題では、以下のいずれかのタイプに該当するQ個のクエリが与えられます。タイプ1 − 挿入 (1, i):値iを持つ要素をデータ構造に追加します。タイプ2 − findXOR (2, i):データ構造内のすべての要素と要素iとのXORの最大値を求めます。データ構造には、初期状態として要素0のみが含まれているものとします。問題を理解するための例を見てみましょう。入力Queries: (1, 9), (1, 3), (1, 7), (2, 8), (1, 5), (2, 12)出力15 15説明各クエリを順に処理すると、 (1, 9) => データ構造 => {9} (1, 3) =

  7. C++でサイズkの部分配列における最大XOR値を効率的に求める方法

    この問題では、n個の要素からなる配列 arr[] と整数 k が与えられます。求めるのは、サイズkの部分配列(サブアレイ)の中で、要素全体のXOR値が最大になるものです。入力例arr[] = {3, 1, 6, 2, 7, 9} k = 3出力例12説明サイズkのすべての部分配列と、その要素のXOR値は以下のようになります。{3, 1, 6} = 4 {1, 6, 2} = 5 {6, 2, 7} = 3 {2, 7, 9} = 12この中で最大のXOR値は 12 であり、これが答えとなります。解法アプローチシンプルな解法:二重ループ最も単純な方法は、二重ループを使うことです。外側のループで配

  8. C++で配列内のサブ配列平均値の平均を求めるアルゴリズム

    問題の概要この記事では、サイズnの整数型配列arr[]と整数mが与えられたときに、サブ配列平均の平均を求める方法を解説します。ここでいうサブ配列とは、元の配列から連続するm個の要素を取り出したものを指します。つまり、まず各サブ配列の平均値を計算し、次にそれらの平均値をさらに平均した値を求めることになります。入力例と出力例入力arr[] = {2, 5, 3, 6, 1}, m = 3出力3.78計算の流れサイズm=3のサブ配列は {2, 5, 3}、{5, 3, 6}、{3, 6, 1} の3つ存在します。それぞれの平均は以下のように計算できます。{2, 5, 3} の平均:(2+5+3)/3

  9. C++で行ごとにソートされた行列の中央値を効率的に求める方法

    この記事では、行ごとにソートされた2次元配列 mat[r][c] が与えられたとき、その行列全体の要素の中から中央値(メディアン)を求めるアルゴリズムについて解説します。問題の概要各行が昇順にソートされている行列が与えられます。この行列に含まれるすべての要素の中で、中央に位置する値(中央値)を見つけることが目的です。入力例mat = { {2, 4, 7}, {5, 6, 8}, {4, 8, 9} }出力例6説明行列のすべての要素を1つの配列にまとめると、以下のようになります。{2, 4, 4, 5, 6, 7, 8, 8, 9} 中央値は 6要素数は9個なので、ソー

  10. 【C++】指定されたセグメント長から中点を含むセグメントを検索する方法

    問題概要 この問題では、線分の長さを格納したサイズ m の配列 arr[] が与えられます。 線分は「0 から arr[0] まで」「arr[0] から arr[1] まで」というように順番に連結され、全体として1本の長い線を構成しています。求めたいのは、全線分の中間点が含まれるセグメントの番号です。 入出力例 入力 arr[] = {5, 7, 13} 出力 3 説明 線分 : (0, 5)、(5, 12)、(12, 25) 全体の長さは 25 なので、中点の座標は 12.5 になります。この中点は3番目のセグメント (12, 25) に含まれるため、答えは 3 となります。 解法アプ

  11. C++で二分木の最小深度を求めるアルゴリズムと実装方法

    この記事では、二分木が与えられたときに、その最小深度(Minimum Depth)を求める問題について解説します。二分木とは、各ノードが最大で2つの子ノードを持つことができる特別な木構造のことです。そして、二分木の最小深度とは、ルートノードから最も近い葉ノードまでの最短経路の長さを指します。問題の例具体的な例を使って問題を理解しましょう。入力 5 / \ 2 9 / \ 5 1 / \ 7 3出力2この例では、ルートノード「5」から葉ノード「9」までの経路の長さが2であり、これが最小深度となります。解法アプローチ1

  12. C++で関係演算子を使わずに配列内の最小値を見つける方法

    この記事では、n個の正の整数で構成される配列 arr[] が与えられたとき、関係演算子を使用せずに配列内の最小値を求める方法を解説します。関係演算子とは関係演算子(比較演算子)とは、プログラミングにおいて2つの値の大小関係や等価性を判定するために使用される演算子です。代表的なものとして、以下のようなものがあります。== (等しい)> (より大きい)< (より小さい)問題の例具体的な入力と出力の例を見てみましょう。入力arr[] = {4, 2, 5, 1, 7}出力1説明配列の中で最も小さい要素は 1 です。解決アプローチこの問題を解く基本的な考え方は、ループ処理を使って配列内のす

  13. C++で配列を回文にするために必要な最小マージ操作回数を求める方法

    問題概要この問題では、n個の正の整数からなる配列 arr[] が与えられます。私たちのタスクは、配列を回文にするために必要なマージ操作の最小回数を見つけることです。回文配列とは、回文文字列と同様に、インデックス i と n-1-i の位置にある要素が同じ値である配列のことを指します。例{5, 1, 7, 2, 7, 1, 5}この配列は左右対称になっているため、回文配列です。問題の詳細配列に対して操作を行い、回文の状態にする必要があります。配列に対して有効な唯一の操作はマージ操作で、これはインデックス i と i+1 の隣接する2つの要素を足し合わせて1つにまとめる操作です。与えられた配列を回

  14. 【C++】配列を「美しい配列」にするために必要な最小操作回数を求めるアルゴリズム

    本記事では、0と1のみで構成される長さnの2進数配列bin[]が与えられたとき、この配列を「美しい配列」に変換するために必要な最小操作回数を求める方法を解説します。 「美しい配列」とは、0と1が交互に並ぶパターンを持つ特殊な2進数配列のことです。 問題の概要 配列を美しい配列にするために必要な操作回数を求めます。1回の操作は、次の3つのステップで構成されます。 ステップ1:配列を前半と後半の2つに分割する ステップ2:どちらか一方の半分を反転させる ステップ3:分割した2つを再び連結する この操作を何回繰り返せば配列が美しい配列になるかをカウントします。 具体例で理解しよう 入力 bin[

  15. C++で数値dの倍数を加算した後に可能な最小の桁和を求める方法

    この問題では、2つの整数 n と d が与えられ、n に d の倍数を加算したときに実現できる最小の桁和を求めることが課題となります。 問題の説明 n に対して d の k 倍(k = 1, 2, 3, …)を加算して得られる数値のうち、桁和が最も小さくなるものを見つけます。ここで扱う「桁和」は、各桁の合計が1桁になるまで計算を繰り返すデジタルルートに相当します。 入力例 n = 5230, d = 54 出力例 1 解説 5230 + (2 × 54) = 5338 5 + 3 + 3 + 8 = 19 → 1 + 9 = 10 → 1 + 0 = 1 解法のアプローチ シンプルな解法として

  16. 【C++】指定したルールに従って要素を削除したときの配列の最小サイズを求める方法

    この問題では、n個の数値からなる配列と整数値kが与えられます。与えられたルールに従って要素を削除したとき、配列が取りうる最小のサイズを求めるのが課題です。問題の概要配列内の要素数をできるだけ減らすことを目標とします。使用できる削除操作では、一度に3つの要素を削除できます。ただし、削除が可能なのは、次の2つの条件を満たす場合のみです。条件1 — 3つの要素が互いに隣接していること条件2 — 隣接する要素同士の差がkであること。つまり、arr[i + 1] = arr[i] + k かつ arr[i + 2] = arr[i + 1] + k が成り立つこと入力例{4, 6, 8, 4, 1, 5

  17. C++で全ジョブ完了に必要な最小速度を求めるアルゴリズム(二分探索)

    この問題では、n個の要素からなる配列 arr[] と整数 h が与えられます。配列の各要素には、その人が処理すべき未完了ジョブの数が格納されており、H はジョブ完了までに残された時間(単位:時間)を表します。求めるのは、すべてのジョブを時間内に完了させるための最小速度(1時間あたりに処理できるジョブ数)です。問題の概要与えられた配列内のすべてのジョブを H 時間以内に完了させるために、その人が1時間あたりに処理すべきジョブ数を求めます。あるジョブセットが1時間以内に終わった場合、残りの時間は待機し、1時間が経過した時点で次のジョブセットへ移ります。入力例arr[] = {4, 5, 1, 7,

  18. C++で2次元平面上の点の鏡像(鏡映点)を求める方法

    この記事では、2次元平面上の点Pと、直線の方程式 ax + by + c = 0 の係数 a・b・c が与えられたときに、この直線を鏡とした点Pの鏡像(鏡映点)をC++で求める方法を解説します。 問題を理解するための例 入力 P = (2, 1), a = 1, b = -1, c = 0 出力 (1, 2) 説明 与えられる直線は y = x です。この直線を鏡として点 (2, 1) を反射すると、x座標とy座標が入れ替わった位置 (1, 2) が鏡像となります。平面の様子は下図の通りです。 解法アプローチ この問題を解くには、鏡像となる点P(x, y) の座標を求める必要があり

  19. 【C++】二分木で特定のノードのミラー(鏡像)を検索する方法

    この問題では、二分木(バイナリツリー)が与えられ、指定されたノードの「ミラー(鏡像)」となるノードを木の中から探します。ここでいうミラーとは、反対側の部分木にある対称の位置に相当するノードのことです。木を中心線で折り返したときに重なり合う位置関係をイメージすると分かりやすいでしょう。 問題例 入力 出力 B のミラーは E 解き方のアプローチ 最もシンプルな解法は、根(ルート)から再帰的に探索を行う方法です。左部分木と右部分木を指す2つのポインタを用意し、両側を同時にたどっていきます。片方のノードが目的の値と一致した時点で、対になる反対側のノードの値を返します。見つからない場合は、さらに深

  20. C++で範囲内の欠落している要素を検索する方法

    この記事では、サイズ n の配列 arr[] と、範囲を示す開始値・終了値が与えられたときに、範囲内で欠落している要素を見つける方法を解説します。問題の概要与えられた範囲 [start, end] に含まれるべき整数のうち、配列 arr[] に存在しない要素をすべて見つけて出力するのが目的です。入力例arr[] = {4, 6, 3, 7}, start = 3, end = 8出力例5, 8説明範囲は [3, 4, 5, 6, 7, 8] であり、配列は {4, 6, 3, 7} です。したがって、配列に存在しない範囲内の要素は 5 と 8 になります。解決アプローチこの問題は複数の方法で解

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:259/300  20-コンピューター/Page Goto:1 253 254 255 256 257 258 259 260 261 262 263 264 265