C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++でNxNグリッドの最小下降パスの合計を求める方法

    問題文N×Nのサイズを持つ整数行列 A が与えられます。この課題では、A を通る「下降パス(Falling Path)」の最小合計を求めることが目標です。下降パスは、最初の行の任意の要素から開始し、最後の行で終了します。パスは次の行ごとに1つの要素を選択していきます。ただし、次の行で選ぶ要素の列は、前の行で選んだ列と同じ列、または左右に1つだけ隣接する列でなければなりません。例N = 2、行列が以下の場合: { {5, 10}, {25, 15} } 出力は 20 となります(要素 5 と 15 が選択されるため)解法の考え方(動的計画法)この問題は動的計画法(DP)を用いるこ

  2. C++で双方向リンクリストを使用した優先度付きキューの実装

    整数値のデータと優先度が与えられ、その優先度に従って双方向リンクリスト(doubly linked list)を作成し、結果を表示することが本記事の課題です。 優先度付きキューとは? キュー(Queue)はFIFO(First In, First Out:先入れ先出し)方式のデータ構造であり、最初に挿入された要素が最初に取り出されます。優先度付きキュー(Priority Queue)は、要素の優先度に応じて挿入や削除を行えるキューの一種です。キュー、スタック、リンクリストなどのデータ構造を使って実装でき、本記事では双方向リンクリストを用います。 優先度付きキューは、次のルールに従って動作しま

  3. C++で2個のサイコロをN回投げたときに指定した合計が出る確率を求める方法

    この記事では、「合計値」と「サイコロを投げる回数」が入力として与えられたときに、2個のサイコロをN回投げた結果、指定した合計が出る確率を求める方法をC++で解説します。確率とは、与えられたデータの集合の中から望む結果を得られる可能性のことを指します。確率の範囲は0から1の間であり、0は「不可能」を、1は「確実」を表します。具体例入力:sum = 12, N = 1 出力:確率 = 1/36 説明:2個のサイコロを1回投げたときの出目の組み合わせは (1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (2, 1), (2, 2), (2, 3), (2

  4. C++で無向グラフ内のすべてのサイクルの長さの積を求める方法

    本記事では、無向かつ非重み付きグラフが入力として与えられたとき、そのグラフ内に形成されるすべてのサイクルの長さ(頂点数)の積を求め、結果を出力する方法を解説します。具体例入力例1この図では合計8つのノードがあり、そのうちノード1、6、3、5、8の5つがサイクルを形成しています。残りのノードはサイクルに含まれません。したがって、サイクルの長さは5であり、積は5となります。入力例2この図では合計12のノードがあり、そのうち11個(5個+6個)のノードが2つのサイクルを形成しています。1つ目はノード1、6、3、5、8からなるサイクル、2つ目はノード9、4、10、11、22、12からなるサイクルです。

  5. C++で最小・最大要素を除いたサイズKのすべての部分列の積を求める方法

    問題概要n個の整数を含む配列 arr[n] と、部分列のサイズを指定する整数 k が与えられたとき、最小要素と最大要素を除いたすべてのサイズ k の部分列の積を求めて出力することが課題です。例として、4つの要素からなる集合 {1, 2, 3, 4} と k = 2 を考えてみましょう。この場合の部分集合は以下の6つになります。{1, 2}, {2, 3}, {3, 4}, {1, 4}, {1, 3}, {2, 4}最大要素である 4 と最小要素である 1 を除外すると、残る要素は次の通りです。2, 3, 3, 3, 2これらの積を計算すると:2 × 3 × 3 × 3 × 2 = 108同様

  6. C++ STL(標準テンプレートライブラリ)のプライオリティキュー徹底解説

    プライオリティキュー(優先度付きキュー)は、優先度を持つ要素のコレクションを格納するための抽象データ型(ADT)です。各要素は優先度に基づいて挿入・削除が行われ、最も優先度の高い要素はいつでも取り出すことができます。スタックやキュー、リストなどの線形データ構造とは異なり、プライオリティキューは要素を格納位置の順序ではなく、優先度に基づいて管理する点が大きな特徴です。C++では、STLの <queue> ヘッダで提供されており、デフォルトでは最大値が先頭に来る構造になっています。プライオリティキューがサポートする主な操作size() — プライオリティキュー内の要素数を返し、サイズを

  7. C++で解く!N回のコイントスで表が少なくともK回出る確率の求め方

    確率とは、与えられたデータの集合の中から望ましい結果が得られる可能性のことです。確率は必ず0以上1以下の範囲に収まり、0は「絶対に起こらない」こと、1は「必ず起こる」ことを意味します。 確率とは何か? 数学における確率は、事象の不確実性を測定・分析するための重要な道具です。言い換えるなら、確率とはある事象が発生する見込みを0から1までの数値で表現したものであり、その数値が1に近づくほど事象が実現しやすいことを示します。 例えば、次のようなものが挙げられます。 偏りのないコインを1回投げたときに表が出る確率 サイコロを1回振ったときに3の目が出る確率 問題設定:N回のトスで表がK回以上出る確

  8. 【C++】入力(a, b)から「a」で始まり「a」で終わる文字列を判定するDFAを構築するプログラム

    文字「a」と「b」から構成される文字列が与えられたとき、その文字列が「a」で始まり、かつ「a」で終わっているかどうかをDFA(決定性有限オートマトン)を用いて判定する方法を解説します。 DFA(決定性有限オートマトン)とは? 理論計算機科学の一分野である計算理論において、決定性有限オートマトン(DFA:Deterministic Finite Automata)とは、記号の列を受け入れるか拒否するかを判定する有限状態機械です。「決定的(Deterministic)」とは、現在の状態と入力記号が決まれば、遷移先の状態が必ず一意に定まることを意味します。 本記事では、入力 (a, b) から

  9. C++で2本の直線の交点を求めるプログラムの書き方

    直線ABを定義する2点A・Bと、直線CDを定義する2点C・Dが与えられたとき、この2つの直線の交点を求めるのが課題です。 注意 − すべての点は、X座標とY座標を持つ2次元平面上にあるものとします。 図では、A(a1, a2)とB(b1, b2)を通る直線、C(c1, c2)とD(d1, d2)を通る直線という、互いに異なる2つの直線が描かれており、P(p1, p2)がその交点を表しています。 交点の求め方 まず、2点を通る直線を「ax + by = c」の形の方程式で表します。各点の座標を使って、次のように係数を計算します。 A1 = b2 - a2 B1 = a1 - b1 C1 =

  10. C++で配列内のk番目ごとの素数の積を求める方法

    問題概要n個の素数を含む配列arr[n]と整数kが与えられたとき、配列内のk番目ごとの素数の積を求めることが本記事の課題です。例えば、配列arr[] = {3, 5, 7, 11}、k = 2が与えられた場合、2番目ごとの素数である「5」と「11」を取り出し、その積(5 × 11 = 55)を計算して結果を出力します。素数とは?素数とは、1とその数自身以外のどの数でも割り切れない自然数のことです。素数の例としては、2、3、5、7、11、13などが挙げられます。入出力例入力: arr[] = {3, 5, 7, 11, 13}、k = 2 出力: 55 説明: 配列の2番目ごとの要素は「5」と「

  11. C++で0/1ナップサック問題を解き、選ばれたアイテムを出力する方法

    n個のアイテムの重さと価値が与えられたとき、容量Wのナップサックに収まる範囲で合計価値が最大になるようにアイテムを選び、実際に選ばれたアイテム(重さ)を出力するのが本記事の目的です。 0/1ナップサックとは? ナップサックとは、サイズや耐えられる重量が固定された袋のことです。ナップサックに入れる各アイテムには、それぞれ価値(利益)と重さがあります。ナップサックが保持できる総重量の範囲内で、利益が最大になるようにアイテムを選ぶ必要があります。 各アイテムの重さ、価値(利益)、そしてナップサックが保持できる総重量が分かっているとき、0/1ナップサックでは各アイテムを「入れる(1)」か「入れない(0

  12. C++で最近使用したアプリ(MRU)を表示するプログラムの実装方法

    数値 k と、システム上で開かれているアプリのIDを格納した n 個の整数要素を持つ配列 arr[n] が与えられたとします。この課題では、キーボードの Alt + Tab を押したときのように、最近使用した順に k 個のアプリを表示します。各IDの位置は、システム内のそれぞれ異なるアプリを表しています。 配列の構成は次のとおりです。 arr[0] のIDは、現在使用中のアプリです。 arr[1] のIDは、直前に使用されたアプリです。 arr[n-1] のIDは、最も長く使用されていないアプリです。 補足: Alt + Tab キーを押すと、インデックス0(現在使用中のアプリ)から順に、

  13. C++で複素数のn乗をO(log n)の計算量で求めるプログラム

    複素数 x+yi と整数 n が与えられたとき、その複素数を n 乗した値を計算して出力するのがこの記事の目的です。 複素数とは? 複素数とは、a + bi という形で表すことができる数のことです。ここで a と b は実数、i は虚数単位(i² = −1 を満たす数)を指します。簡単に言えば、複素数は実数部と虚数部を組み合わせた数だと考えることができます。 複素数のべき乗の計算方法 複素数同士の積を求めるには、次の公式を使用します。 (a+bi)(c+di) = (ac − bd) + (ad + bc)i たとえば、複素数 2+3i を 5 乗する場合は、次のように表されます。 (2+3i

  14. C++におけるペアの優先度付きキュー実装方法(1つ目の要素を基準にソート)

    優先度付きキュー(priority_queue)とは優先度付きキューは、優先順位を持つ要素の集合を格納するための抽象データ型(ADT)です。各要素は優先度に基づいて挿入・削除が行われ、最も高い優先度を持つ要素はいつでも取り出すことができます。通常のスタックやキュー、リストなどが要素を線形に格納するのに対し、優先度付きキューは要素の位置ではなく「優先度」を基準として要素を管理する点が大きな特徴です。優先度付きキューがサポートする主な操作size() — 優先度付きキューに格納されている要素数を返します。empty() — キューが空の場合は true を、そうでなければ false を返します。

  15. C++で互いに素な区間の最大集合を求めるアルゴリズム

    概要N個の区間(インターバル)が与えられたとき、互いに素な(重ならない)区間の最大集合を見つけることが本記事の課題です。2つの区間 [i, j] と [k, l] は、共通の点を1つも持たない場合に「互いに素(disjoint)」であると定義されます。例えば、区間が {{10, 20}, {23, 35}, {15, 21}, {37, 41}} である場合、重なりなく選択できる最大の組み合わせは以下の通りです。{10, 20} {23, 35} {37, 41}ここで注意したいのは、{15, 21} を含めることができないという点です。{15, 21} は {10, 20} と重なってしまう

  16. C++で両端のビットを入れ替えて符号なし整数を最大化する方法

    問題概要 与えられた符号なし整数を、両端に位置するビット同士を入れ替えることによって最大化します。具体的には、最下位ビットと最上位ビット、下から2番目と上から2番目といった具合に、対称な位置にあるビットを順に交換していきます。 例として、入力が 8 の場合を考えてみましょう。2進数表現は次のようになります。 00000000 00000000 00000000 00001000 対称な位置のビットを入れ替えると、セットされているビット(第3ビット)は第28ビットへ移動し、結果は次のようになります。 00010000 00000000 00000000 00000000 この数値の10進数での

  17. C++で配列要素の加減算により指定範囲内の最大値を求める方法

    問題文整数の配列、初期値となる数値、および最大値が与えられます。配列の要素を先頭から順に走査し、各要素について「現在の結果に加算する」か「減算する」かを選択します。ただし、どの時点でも結果は 0 以上かつ最大値以下でなければなりません。インデックス 0 の処理では、与えられた数値を初期結果として扱います。条件を満たす答えが存在しない場合は -1 を出力します。例として、arr[] = {3, 10, 6, 4, 5}、number = 1、最大値 = 15 が与えられた場合、次の順序で加算・減算を行うと出力は 9 になります。1 + 3 + 10 - 6 - 4 + 5アルゴリズムこの問題は再

  18. 【C++】K回の符号反転操作で配列の合計を最大化する方法

    問題の概要サイズ n の整数型配列と、操作回数を表す数値 k が与えられます。私たちの課題は、この配列に対してちょうど k 回の「修正操作」を実行することです。ここでいう修正操作とは、1 回ごとに配列内の任意の要素 arr[i] を選び、その符号を反転させる(すなわち arr[i] = -arr[i] とする)ことを指します。k 回の操作を終えた時点で、配列全体の合計値が最大になるように操作を行うことが目標です。例として、入力が arr[] = {7, -3, 5, 4, -1} の場合、最大合計は 20 になります。具体的な手順は以下のとおりです。まず -3 を反転します。配列は {7, 3

  19. C++で別の配列を使って配列の要素を最大化する方法

    C++では、2つの配列を組み合わせて「大きい要素だけを持つ配列」を作り出すことができます。本記事では、サイズnの2つの配列が与えられたとき、両方の配列からn個の最大かつ重複しない要素を抜き出し、第2配列を優先しながら元の順序を保って第1配列を書き換えるアルゴリズムを、サンプルコードと実行結果あわせて解説します。 問題の概要 サイズnの2つの配列が与えられます。第2配列の要素を使って第1配列を最大化します。このとき、新しく作られる配列は次の条件を満たす必要があります。 両方の配列に含まれる要素の中から、大きい方からn個を選ぶ 選んだ要素は重複してはならない(すべて一意であること) 第2配列の要

  20. C++で部分配列を1回だけ反転して0の個数を最大化する方法

    問題文0と1のみから構成される2値配列(バイナリ配列)が与えられます。ここで、部分配列を1回だけ反転できるという条件のもとで、配列全体に含まれる0の個数を最大化することを考えます。なお、反転操作とは、指定した範囲内のすべての0を1に、1を0に切り替える処理のことです。具体例次の配列を考えてみましょう。arr = {1, 1, 0, 0, 0, 0, 0}先頭の2つの「1」を「0」に反転すると、配列全体が次のようになります。{0, 0, 0, 0, 0, 0, 0}この場合、0の個数は7となり、これが最大値です。解法のポイントある部分配列を反転すると、その範囲内の1は0に、0は1に変わります。し

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:110/300  20-コンピューター/Page Goto:1 104 105 106 107 108 109 110 111 112 113 114 115 116