C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で醜い数(アグリー・ナンバー)のみを含む部分配列の最大長を求める方法

    問題の概要 N個の要素を持つ配列 arr[] が与えられます(0 ≤ arr[i] ≤ 1000)。この問題では、醜い数(アグリー・ナンバー)のみを含む部分配列(サブ配列)の最大長を求めることが求められます。 醜い数とは、素因数が 2、3、5 のみである数のことを指します。それ以外の素因数(7、11、13など)を含む数は醜い数とはみなされません。 例えば、醜い数の数列は次のようになります。 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 15, … 具体例 入力配列が {1, 2, 7, 9, 120, 810, 374} の場合、答えは 3 となります。 これは、醜い数のみ

  2. C++でQ番目の人が取得できる棒の最大長を求める方法

    この記事では、n本の棒の長さが与えられたとき、順番に棒を受け取っていく各人が取得できる「最大の棒の長さ」を求めるアルゴリズムを、C++のコード例とともに解説します。 問題文 n本の棒の長さが配列として与えられます。ある人が棒を受け取る際には、その時点で最も長い棒の半分((max + 1) / 2)が割り当てられ、残りの部分((max - 1) / 2)は再び利用可能な状態として戻されます。十分な数の棒が常に存在すると仮定し、配列q[]で与えられるM個のクエリに対して、qi番目の人(1から始まる有効な人数)が取得できる最大の棒の長さを答えてください。 例 入力 : a[] = {6, 5, 9

  3. C++で解く!0と1の文字列における「1が優勢なセグメント」の最大長

    問題文0と1だけで構成された文字列が与えられます。この文字列を複数のセグメント(部分文字列)に分割し、各セグメントに含まれる「1」の数が「0」の数より多いようにするとき、選択できるセグメントの合計長の最大値を求めるのが課題です。例入力文字列が 10111000001011 の場合、答えは 12 になります。第1セグメント:長さ 7(1011100)第2セグメント:長さ 5(00010 を除いた残りから有効な部分を選択)合計長 = 7 + 5 = 12ポイントは、必ずしも文字列全体を使う必要はなく、「1の数が0の数を上回る」条件を満たす範囲だけを抜き出して合計することです。アルゴリズムこの問題は

  4. C++で最初と最後の要素が同じ部分配列の最大長を求める方法

    問題概要この問題では、文字の配列(文字列)が与えられます。私たちの課題は、最初と最後の要素が同じである部分配列の最大長を出力するプログラムをC++で作成することです。例で問題を理解しよう入力 − array = {t, u, t, o, r, i, a, l, s, p, o, i, n, t}出力 − 14説明 −この部分配列 {t, u, t, o, r, i, a, l, s, p, o, i, n, t} は、先頭と末尾がどちらも t になっています。解決アプローチこの問題を解くには、配列内の各文字について最初に出現する位置(first occurrence)と最後に出現する位置(la

  5. 【C++】arr[i] ≥ arr[j] を満たす配列の全ペアにおける最大剰余の求め方

    問題概要 この問題では、n 個の要素からなる配列が与えられます。求めるのは、arr[i] ≥ arr[j] を満たすすべてのペアの中で最大の剰余(modulo)の値です。 つまり、arr[i] ≥ arr[j] という条件のもとで、arr[i] % arr[j] の最大値を見つけることが目的となります。 問題を理解するための例 入力: arr[] = {3, 5, 9} 出力: 4 説明: 考えられるすべてのペア arr[i] と arr[j]: 5, 3 => 5%3 = 2 9, 3 => 9%3 = 0 9, 5 => 9%5 = 4 この中で最も大きい剰余は 4 と

  6. 【C++解説】2つのグループから編成できる3人チームの最大数を求める方法

    問題概要この問題では、2つの整数 N と M が与えられます。N はグループ1の人数、M はグループ2の人数を表します。私たちのタスクは、この2つのグループから編成できる3人チームの最大数を求めるプログラムを作成することです。チームは3人で構成され、各チームには必ず両方のグループから少なくとも1人ずつが含まれている必要があります。この条件を満たしながら、できるだけ多くのチームを作ることが目標となります。入出力の例具体例を使って問題を理解しましょう。入力: N = 5, M = 3出力: 2説明:チームは以下のように編成されます。チーム1: グループ1のメンバー → 2人、グループ2のメンバー

  7. C++でN頂点の2部グラフが持てる最大の辺数を求める方法

    問題文頂点の数を表す整数 N が与えられます。このとき、N 個の頂点からなる2部グラフ(バイパータイトグラフ)に含められる最大の辺数を求めるのが課題です。2部グラフとは2部グラフとは、頂点が2つの集合に分けられたグラフのことです。重要な性質として、同じ集合に属する頂点同士は決して辺で結ばれません。すべての辺は、必ず片方の集合の頂点ともう片方の集合の頂点を結びます。具体例N = 10 の場合を考えてみましょう。このとき最大で 25 本の辺が存在できます。両方の集合にそれぞれ 5 つの頂点が入り、第1集合のすべての頂点が、第2集合のすべての頂点と辺で結ばれます。したがって、総辺数は 5 × 5 =

  8. C++で2部グラフを維持したまま木に追加できる最大の辺数を求める方法

    問題の概要木(ツリー)は常に2部グラフ(バイパータイトグラフ)です。これは、交互のレベルごとに2つの互いに素な集合へ分割できるためです。言い換えると、2色を使って交互のレベルが同じ色になるように塗り分けることができます。この問題のタスクは、木が2部グラフであり続けるという条件を満たしたまま、追加できる辺の最大本数を計算することです。例木の辺が次の頂点ペアとして与えられているとします。{1, 2}{1, 3}{2, 4}{3, 5}この場合、2部グラフを維持するためにさらに2本の辺を追加できます。グラフを2色で塗り分けると、{1, 4, 5} と {2, 3} が異なる2つの集合に分かれます。こ

  9. C++で最大1回のスワップで得られる不動点の最大数

    問題概要0 から N-1 までの N 個の要素からなる順列が与えられます。不動点(fixed point)とは、その位置にある値がインデックスと一致する箇所、すなわち arr[i] = i を満たすインデックスのことです。ここで、配列に対して最大 1 回のスワップ(要素の入れ替え)を行えるとします。このとき、得られる不動点の数の最大値を求めてください。例入力配列が {0, 1, 2, 3, 4, 6, 5} の場合、答えは 7 になります。すべての要素を不動点にするには、6 と 5 を入れ替えます。スワップ後は配列全体が不動点となり、不動点の最大値は 7 となります。アルゴリズム入力配列内の各

  10. 【C++】指定サイズの部分配列に含まれる一意な整数の最大数を求める方法

    問題の概要この問題では、サイズnの配列と数値Mが与えられます。求めるのは、指定されたサイズの部分配列(サブ配列)に含まれる一意な整数の最大数を見つけるプログラムです。つまり、重複のない要素(ユニークな要素)の数が最大となる、サイズMの部分配列を探す必要があります。具体例で問題を理解する入力 − array = {4, 1, 2, 1, 4, 3}、M = 4出力 − 4解説 − サイズ4の部分配列は以下の3通りが考えられます。サイズ4の部分配列のすべての組み合わせ{4, 1, 2, 1} = 一意な要素は3個{1, 2, 1, 4} = 一意な要素は3個{2, 1, 4, 3} = 一意な要素

  11. C++で解く!2つの配列から選ぶ部分配列の最大OR和の求め方

    問題文正の整数からなる2つの配列が与えられます。それぞれの配列から同じサイズの部分配列を1つずつ選び、その2つの部分配列に対してビットごとの論理和(OR)を計算したとき、その合計として考えられる最大値を求めてください。例たとえば、次の2つの配列が与えられたとします。arr1[] = {1, 2, 4, 3, 2}arr2[] = {1, 3, 3, 12, 2}この場合、以下のように部分配列を選ぶと最大の結果が得られます。Subarr1[] = {2, 4, 3}Subarr2[] = {3, 3, 12}このとき Subarr1 のOR値は 7、Subarr2 のOR値は 15 となり、合計

  12. C++で二分木における2つの葉ノード間の最大パス合計を求める方法

    問題の概要 この問題では、各ノードが値を持つ二分木が与えられます。私たちのタスクは、二分木における2つの葉ノード(リーフノード)間の最大パス合計を求めるプログラムを作成することです。 ここで求めるのは、値の合計が最大になるような、ある葉ノードから別の葉ノードへのパスです。この最大合計パスには、ルートノードが含まれる場合もあれば、含まれない場合もあります。 二分木(Binary Tree)とは、各ノードが最大2つの子ノードを持つことができる木構造のデータ構造です。それぞれの子ノードは「左の子(left child)」と「右の子(right child)」と呼ばれます。 具体例 以下のような二分木

  13. C++で三角形の最大パス合計を求める方法

    この問題では、三角形の形に配置された数値が与えられます。私たちのタスクは、三角形の中で最大のパス合計を見つけるプログラムを作成することです。要素は、1行目に1つの要素から始まり、行が進むごとに要素数が1つずつ増えていき、n行目まで配置されます。つまり、プログラムは三角形内の要素の合計が最大となるパスを見つける必要があります。頂点から下へ進む際に、隣接する行の要素を選びながら、合計が最大になる経路を求めるのが目標です。具体例を使って問題を理解しましょう。入力例と出力例入力 −   1  5 6 8 2 9出力 − 16説明 −頂点から下

  14. C++で解く逆三角形の最大パス合計問題

    問題概要この問題では、逆三角形の形に並べられた数値が与えられます。各行から1つずつ要素を選んで加算したときに得られる最大の合計(最大パス合計)を求めるプログラムを作成するのが課題です。逆三角形とは、1行目にn個の要素、2行目にn-1個の要素、というように下の行へ向かうにつれて要素数が1つずつ減っていく数値の配置のことです。具体例で理解しよう入力:5 1 9 3 6 2出力: 17解説: 最下行から最上行へ向かって、パスに含まれる要素の合計が最大になるような経路を探索します。この例では「9 → 6 → 2」という経路を選ぶことで、合計17が得られます。解き方:動的計画法(DP)この問題は、

  15. C++で長さkのすべての部分文字列を基数bから10進数に変換する方法

    このチュートリアルでは、文字列から取り出した長さ「k」のすべての部分文字列を、基数「b」の数値として10進数に変換するC++プログラムについて解説します。ここでは、ある長さを持つ文字列が与えられます。私たちのタスクは、その文字列からサイズ「k」の部分文字列を順番に取り出し、それぞれを基数「b」の表現から10進数へと変換することです。アルゴリズムの流れ元の文字列 str、部分文字列の長さ k、基数 b を受け取ります。先頭から順に substr(i, k) を使って長さkの部分文字列を1つずつ取得します。各部分文字列の右端の桁から順に、「桁の値 × bの累乗」を計算して合計します。変換結果をスペ

  16. C++で任意の二分木をChildren Sum Property(子の和の性質)を満たす木に変換する方法

    本記事では、C++を用いて任意の二分木を「Children Sum Property(子の和の性質)」を満たす二分木へ変換するプログラムについて解説します。 Children Sum Propertyとは、すべての内部ノードにおいて「親ノードの値 = 左の子の値 + 右の子の値」が成り立つ性質のことです。子が1つしかないノードの場合は、その唯一の子の値と親の値が一致していればよいことになります。 問題の概要と制約 入力として二分木が与えられ、これをChildren Sum Propertyを満たす形に変換するのが目的です。ただし、以下の制約を守る必要があります。 ノードの値は増加させることの

  17. C++で配列を循環双方向リンクリストに変換する方法を徹底解説

    はじめに本記事では、配列を循環双方向リンクリスト(循環 doubly linked list)に変換するC++ プログラムの実装方法を、コード例とともにわかりやすく解説します。課題の内容はシンプルです。入力として与えられた配列の各要素をノード化し、それらを連結して循環双方向リンクリストを構築します。循環双方向リンクリストとは?通常の双方向リンクリストでは、各ノードが「次のノード(next)」と「前のノード(prev)」へのポインタを持っています。これに対して循環双方向リンクリストでは、末尾ノードの next が先頭ノードを指し、先頭ノードの prev が末尾ノードを指すため、リスト全体がリング

  18. C++でハッシュ(unordered_map)を使って配列を縮小形式に変換する方法

    このチュートリアルでは、ハッシュ(連想配列)を活用して、配列を縮小形式(reduced form)に変換するC++のプログラムについて解説します。縮小形式への変換とは、与えられた配列の要素を、元の大小関係(相対的な順序)を保ったまま 0 ~ n-1 の範囲の値に置き換える処理のことです。例えば、配列 {10, 20, 15, 12, 11, 50} の場合、最も小さい要素「10」は「0」に、次に小さい「11」は「1」に、というように各要素をその順位へと変換します。アルゴリズムの流れ元の配列をコピーし、昇順にソートします。ソート済みの各要素に対して、0 から始まる順位を割り当て、「要素 → 順位

  19. C++でpairのvectorを使って配列を簡約形式(Reduced Form)に変換する方法

    このチュートリアルでは、pairのvector(std::vector<std::pair>)を活用して、配列を簡約形式(reduced form)に変換するC++プログラムについて解説します。簡約形式とは?簡約形式とは、配列内の各要素を、その大小関係(順位)を保ったまま「0」から「n-1」までの連続した整数に置き換えた配列のことです。例えば、次のような配列が与えられたとします。{10, 20, 15, 12, 11, 50}この配列を簡約形式に変換すると、最小値の「10」が「0」、2番目に小さい「11」が「1」となり、以下のようになります。{0, 4, 3, 2, 1, 5}要素

  20. C++で配列をジグザグ順に並べ替えるアルゴリズムを解説

    はじめに このチュートリアルでは、配列をジグザグ形式(zig-zag fashion)に変換するC++プログラムについて解説します。 ここでは、重複のない要素からなる配列が与えられます。私たちのタスクは、隣接する要素どうしが「小さい → 大きい → 小さい → 大きい…」と交互になるように、配列の要素を並べ替えることです。 例えば、入力配列が {4, 3, 7, 8, 6, 2, 1} の場合、期待される出力は {3, 7, 4, 8, 2, 6, 1} となります。この結果では arr[0] < arr[1] > arr[2] < arr[3] … という大小関係が交互に成

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:118/300  20-コンピューター/Page Goto:1 112 113 114 115 116 117 118 119 120 121 122 123 124