C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で木構造の全ノードに情報を伝播させるための最小反復回数を求める方法

    本記事では、n個のノードからなる木構造(ツリー)データ構造が与えられたとき、根ノード(root)からすべてのノードへ情報を行き渡らせるために必要な最小反復回数を求めるアルゴリズムを解説します。 与えられる木には根ノードがあり、各ノードは任意の数の子を持つことができます。ここで重要なルールは、1回の反復につき、あるノードはその子のうち1つにのみ情報を伝えられるという点です。ただし、子ノードがさらにその子へ情報を渡している間も、根ノードは別の子へ情報を渡し続けることができます。この並行性を考慮して、全ノードへの伝達完了までに必要な最小回数を計算します。 入出力シナリオの例 例1: 入力:

  2. C++で2次元配列における最小合計部分行列を求めるアルゴリズム

    問題概要整数要素で構成される2次元配列(行列)が与えられたとき、その中から部分行列を取り出し、合計が最小となる値を求めるのが本記事のテーマです。それでは、具体的な入出力シナリオを見ていきましょう。入出力例1入力 −int matrix[size][size] = { {2, 3, -1, 5}, {-2, 9, -1, 6}, {5, 6, 9, -9}, {-6, 1, 1, 1} }出力 − 与えられた2次元配列における最小合計部分行列は: -9説明 − 4行4列(サイズ4x4)の2次元配列が与えられています。この中から合計が最小となる部分行列を探すと、答えは -9 になります。入出力例2

  3. C++で部分配列の全要素にXを掛けた後、部分配列の和を最大化する方法

    問題の概要 ここでは、整数型の配列と整数変数「X」が与えられます。まず、与えられた配列から部分配列を作成し、次にその部分配列のすべての要素に整数Xを掛け合わせます。最終的に、最大の和を構成する要素を見つけ出すことが目的です。 入出力シナリオ 入力 − int arr[] = {2, 4, 1, -5, -2}, X = 3 出力 − 任意の部分配列の全要素にXを掛けた後の部分配列和の最大値:21 説明 − 配列と整数変数Xが与えられています。まず、配列から部分配列として {2, 4, 1} を取り出します。次に、この部分配列の全要素にX(=3)を掛けると、配列は {6, 12, 3, -5,

  4. C++で実装する中点線分生成アルゴリズムの解説

    線とは2つの点を結ぶものであり、コンピュータグラフィックスにおける最も基本的な要素です。線を描画するには、画面上に線を引くための2つの点が必要です。グラフィックスの世界では、これらの点を「ピクセル」と呼び、すべてのピクセルには整数座標が割り当てられています。本記事では、x1 < x2 かつ y1 < y2 を満たす整数座標 (x1, y1) と (x2, y2) が与えられたとき、中点線分生成アルゴリズム(Midpoint Line Generation Algorithm)を用いて、点1 (x1, y1) と点2 (x2, y2) の間の中間点をすべて計算する方法を解説します。画

  5. C++で解く最小単語分割(Minimum Word Break)問題:トライ木による効率的な実装

    任意のサイズの単語からなる文字列配列が与えられたとき、その連結文字列をあらゆる方法で分割し、分割後の各部分がすべて有効な単語になるようにすることを考えます。そのような分割の中で、必要となる最小の分割回数を求めるのが本問題の目的です。 まず、具体的な入出力シナリオを見てみましょう。 入出力の例 入力 − string word[] = {"Hello", "Hell", "tell", "well", "bell", "ball", "all" } 出力 −

  6. C++で多項式の根の和を最小化する

    整数の配列が与えられ、これが多項式の係数を表しているとします。配列のサイズはn、つまり要素数です。多項式の次数は常に n-1 になります(末尾が定数項になるため)。この係数を並べ替えて、多項式の根の和を最小化するのが課題です。 入力と出力の例 例 1 入力: int arr[] = { 2, -1, 4, 9, -1, 10, -5 } 出力: Minimize the sum of roots of a given polynomial is: -1 -5 2 4 9 -1 10 解説: 要素数7の配列なので、多項式の次数は6次です。並べ替え後の多項式は以下のようになります。 -1 *

  7. C++で指定範囲内の最大部分配列和を求める方法|セグメント木による実装

    任意のサイズの整数要素からなる配列が与えられます。この記事では、指定された範囲(first〜last)内で、配列の任意のインデックスから始まる連続した部分配列の中から、合計値が最大になるものを求める方法を解説します。 この種の問題はセグメント木(Segment Tree)を使うことで効率的に解けます。各ノードに「区間の合計」「左端から伸びる最大和」「右端で終わる最大和」「区間内の最大部分配列和」の4つの情報を持たせることで、範囲クエリに対して O(log N) で答えを取得できます。 入出力シナリオの例 入力 − int arr[] = { 3, 2, -1, 6, 7, 2 }, int f

  8. C++でミディの定理を検証する方法

    分子を格納する整数 a_num と、素数であることが前提となる分母を格納する整数 p_den が与えられます。この記事では、a_num を p_den で割って得られる循環小数に対する操作により、ミディの定理(Midy's theorem)が成り立つかどうかを検証する方法を解説します。 ミディの定理とは ミディの定理とは、分母が素数 p である分数 a/p を小数展開したとき、循環節の桁数が偶数であれば、その循環節を前半と後半に分割して加算すると、すべての桁が9になるという定理です。 ミディの定理を証明する手順 分子を a_num、分母を p_den(必ず素数)として入力します。

  9. C++で3次元配列の最小合計パスを求めるアルゴリズムと実装方法

    本記事では、3次元配列 cube[length][breadth][height] として表現される立方体(キューブ)が与えられたとき、その中を移動して到達できる「最小合計パス」を計算し、結果を出力する方法を解説します。パスの移動は、各軸方向(length・breadth・height)にのみ進むことを想定し、動的計画法(DP)を用いて効率的に最小コストを求めます。入出力の例まず、具体的な入出力シナリオを見てみましょう。例1入力:int cube[length][breadth][height] = { { {2, 4, 1}, {3, 4, 5}, {9, 8, 7}},

  10. C++で範囲[L、R]内における最大K回の移動での数値の合計を最大化する

    本記事では、整数を含む配列 Arr[] と、複数のクエリを格納した2次元配列 Q が与えられたときの問題を解説します。各クエリは lpos(開始インデックス)、rpos(終了インデックス)、K(最大ステップ数) の3つの値で構成されています。インデックスiからは、1ステップで次のインデックスi+1へ進むか、現在の位置にとどまることができます。lposからrposへは、最大Kステップ以内で移動しなければなりません。移動中は、左端の数値を含めて各ステップで訪れた位置の数値をすべて加算し、その合計を最大化することが目標です。Kステップ以内でlposからrposへの移動が不可能な場合は「No」を出力し

  11. C++でビットの入れ替えによりXORが0になる部分配列の個数を求める方法

    問題概要 整数値を含む配列 Arr[] が与えられます。このとき、XOR(排他的論理和)が 0 になる部分配列の個数を最大化することが目標です。ただし、任意の部分配列については、その構成要素同士でビットを何度でも入れ替えられるものとします。 制約:1 ≤ Arr[i] ≤ 1018 ビットの入れ替えによってある部分配列の XOR を 0 にするためには、次の 2 つの条件を満たす必要があります。 区間 left ~ right に含まれるセットビット(値が 1 になっているビット)の総数が偶数であること。 任意の区間において、セットビット数の合計が「区間内で最もセットビット数が多い要素」のセ

  12. 2-3木(2-3ツリー)とは?C++で学ぶデータ構造とアルゴリズムの基礎

    2-3木とは2-3木(2-3ツリー)は、データ構造における木構造の一種で、すべての内部ノードが「2ノード」または「3ノード」のいずれかで構成される平衡木です。次数3のB木(B-Tree)の特殊な形と考えることができます。2ノードとは、データを1つ持ち、子ノードを2つ持つノードのことです。3ノードとは、データを2つ持ち、子ノードを3つ持つノードのことです。図:2-3木の例2-3木の性質すべての内部ノードは、2ノードまたは3ノードのいずれかである。データを1つ持つノードは、子をちょうど2つ持つ2ノードか、子を持たない葉ノードのどちらかである。データを2つ持つノードは、必ず子をちょうど3つ持つ3ノー

  13. C++17の新機能まとめ|押さえておきたい6つの主要機能を解説

    C++の標準化委員会は、3年ごとに新しい機能を取り入れた標準規格の策定を続けています。仕様は大きく分けて、プログラミング言語のコア機能と標準テンプレートライブラリ(STL)の2つで構成されており、C++17ではコードをよりクリーンで簡潔、かつ書きやすくするための数々の新機能が導入されました。この記事では、C++17で追加された主要な新機能を6つに分けて、構文やサンプルコードとともにわかりやすく解説します。 1. 畳み込み式(Fold Expressions) 畳み込み式は、可変個の引数を関数に渡したり関数から返したりする際に、より短いコードを書くための機能です。任意の個数の変数を引数として扱え

  14. C++で配列の区間最小値・最大値クエリを処理する方法(セグメント木の実装)

    はじめにN個の要素を含む配列 Arr[] が与えられたとき、クエリで指定されたインデックス範囲内の最小値と最大値を求めるのが本記事の目的です。各クエリには、開始インデックス(QStart)と終了インデックス(QEnd)が与えられます。例1入力: Arr[] = { 1, 2, 3, 4, 5 }、QStart = 1、QEnd = 4出力:最小値:2最大値:5説明: このクエリでは、開始インデックスが1、終了インデックスが4です。この範囲内にある配列要素のうち、最小値は「2」、最大値は「5」となります。例2入力: Arr[] = { 10, 12, 3, 2, 5, 18 }、QStart =

  15. C++で学ぶ二項ヒープのメモリ表現 ― 二項木の構造とノードの5つのフィールド

    二項木(Binomial Tree)とは? 二項木とは、順序木データ構造の一種です。最小の二項木 B0 は単一のノードで構成され、一般に Bk で表される二項木は、2つの Bk-1 の二項木を連結したものになります。このとき、片方の二項木の根は、もう片方の二項木の根の左端の子として接続されます。この性質により、次数 k の二項木は必ず 2k 個のノードを持ちます。 なお、「二項木」という名前は金融分野のオプション価格評価(二項モデル)でも登場しますが、本記事で扱うのはデータ構造としての二項木・二項ヒープであり、主に優先度付きキューの効率的な実装に活用されます。 二項ヒープ(Binomial H

  16. C++で偶数インデックスの要素は前方の全要素以下、奇数インデックスの要素は前方の全要素以上となるように配列を再配置する方法

    問題の概要奇数と偶数の整数値が混在する整数型配列が与えられます。この配列を、インデックスの偶奇に応じて次の条件を満たすように並べ替えることが課題です。インデックス i が偶数のとき:arr[i] <= arr[j](j < i を満たすすべての j に対して)。つまり、その位置の要素は自分より前にある全要素以下になります。インデックス i が奇数のとき:arr[i] >= arr[j](j < i を満たすすべての j に対して)。つまり、その位置の要素は自分より前にある全要素以上になります。結果として、配列は「小さい値・大きい値」が交互に並ぶジグザグ状のパターンへと再

  17. C++で学ぶ再帰処理:N未満の数値から「1」と「3」のみで構成される数をすべて出力する方法

    概要正の整数値が格納された整数変数Nが与えられます。この記事の課題は、与えられた値N未満の数値のうち、1、3、またはその両方のみで構成されるすべての数値を、再帰処理を用いて出力することです。入出力シナリオの例入力 − int num = 40出力 − N未満の数値のうち、1または3のみで構成される数値は次のとおり: 33 31 13 11 3 1説明 − 変数numには正の整数値40が格納されています。1と3(またはその両方)のみで構成される数値を再帰的に探索すると、40未満の該当する数値は1、3、11、13、31、33であることが分かります。入力 − int num = 5出力 − N未満の

  18. 【C++】非常に大きなnとxに対するn^xの桁の再帰的合計の求め方

    問題概要 正の整数 num と x が与えられます。求めるのは、num の x 乗(num^x)を計算し、その結果の各桁の数字を合計する操作を、結果が1桁になるまで繰り返したときに最終的に得られる「1桁の数字」です。 num や x が非常に大きくなると、num^x を直接計算することは現実的ではありません。そこで本記事では、デジタルルート(digital root)の性質を利用して、巨大な累乗でも高速に答えを求める手法を解説します。 入出力例 入力: int num = 2345, int x = 3 出力: n^x の桁の再帰的合計(n と x は非常に大きい): 8 説明: num =

  19. 【C++】配列内のxの倍数である要素だけを昇順に再配置するプログラム

    本記事では、整数型配列「int arr[]」と整数型変数「x」が与えられたとき、配列の中で「x」で割り切れる要素だけを取り出して昇順に並べ替え、元々その要素があった位置に戻すC++のプログラムを解説します。xの倍数ではない要素は、元の位置にそのまま残ります。 入出力のシナリオ例 入力 − int arr[] = {4, 24, 3, 5, 7, 22, 12, 10}, int x = 2 出力 − x=2の倍数である要素を昇順に再配置した結果: 4 10 3 5 7 12 22 24 解説 − 整数型配列 {4, 24, 3, 5, 7, 22, 12, 10} と x = 2 が与えられて

  20. C++で配列を最大・最小交互形式に並べ替えるプログラム

    整数型の配列が与えられます。この配列はソート済みの場合もあれば、未ソートの場合もあります。求められるタスクは、まず配列が未ソートであれば昇順にソートし、その後、配列を次のような順序で並べ替えることです。 つまり、1番目の要素には最大値、2番目の要素には最小値、3番目の要素には2番目に大きい値、4番目の要素には2番目に小さい値……というように、最大と最小を交互に配置していきます。 入出力シナリオの例 入力 − int arr[] = {7, 5, 2, 3, 4, 9, 10, 5} 出力 − 並べ替え前の配列: 2 3 4 5 5 7 9 10最大最小形式に再配置した配列: 10 2 9 3

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:272/300  20-コンピューター/Page Goto:1 266 267 268 269 270 271 272 273 274 275 276 277 278