C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で文字列を二分探索する方法をわかりやすく解説

    文字列の二分探索(バイナリサーチ)とは、ソート済みの文字列配列が与えられたとき、二分探索アルゴリズムを使って配列の中から目的の文字列を効率よく検索する手法です。 例 入力 : stringArray = {"I", "Love", "Programming", "tutorials", "point"} 検索対象 = "Programming" 出力 : 文字列はインデックス 2 で見つかりました 説明 : 文字列 "Programming" のインデッ

  2. C++で二項係数を計算する方法:再帰と動的計画法による実装

    二項係数とは二項係数は C(n, k) または ⁿCᵣ と表記され、(1+X)ⁿ を二項展開したときの xk の係数として定義されます。また、二項係数は「n 個の要素の中から k 個を選ぶ方法の総数」、すなわち n 要素の集合から取り出す k 個の組み合わせ(k-combination)の数も表します。選ぶ順序は考慮されない点に注意してください。この記事では、パラメータ n と k が与えられたときに、二項係数 ⁿCₖ の値を返すプログラムを C++ で実装します。例入力 : n = 8, k = 3 出力 : 56この問題には複数の解法が存在します。以下では、代表的な2つのアプローチを紹介し

  3. C++で面積と底辺が指定された三角形の最小の高さを求める方法

    問題の説明2つの整数 a(必要な面積)と b(底辺)が与えられたとき、面積が少なくとも「a」以上となる三角形を作るために必要な最小の高さを求める問題です。例a = 16、b = 4 の場合、最小の高さは 8 になりますこのとき、高さが 8 未満だと面積が 16 に届かないため、8 が条件を満たす最小の値となります。アルゴリズム三角形の面積は、次のよく知られた公式で計算できます。面積 = 1/2 × 高さ × 底辺この公式を変形すると、高さは次のように求められます。高さ = (2 × 面積) ÷ 底辺ここで重要なのは、面積が「少なくとも a 以上」でなければならないという点です。そのため、計算結

  4. C++で左側をすべて1、右側をすべて0にするための最小反転回数を求める方法

    問題文 「0」と「1」からなる2進文字列が与えられます。この文字列を反転(フリップ)して、左側をすべて「1」、右側をすべて「0」にするとき、必要となる最小の反転回数を求めるのが課題です。 例 与えられた2進文字列は「0010101」です。この文字列には「1」が3個、「0」が4個含まれています。下記のように4ビットを反転することで、左側がすべて「1」、右側がすべて「0」の文字列にすることができます。 0010101 反転後の文字列は次のとおりです。 1110000 アルゴリズム 文字列を左から右へ走査し、各位置までの「0」をすべて「1」に変換するために必要な反転回数を累積的に計算します。 文

  5. C++で全ての文字列を一致させるための最小移動回数を求める方法

    問題の概要互いに回転(順列)の関係にある n 個の文字列が与えられます。使用できる操作は「任意の文字列の先頭の1文字を取り出し、その文字列の末尾へ移動する」ことだけです。この操作を繰り返してすべての文字列を同一にするとき、必要となる最小の操作回数を求めます。例arr[] = {abcd, cdab} の場合、必要な移動回数は 2 回です。最初の文字列 abcd に対して、文字 a を末尾へ移動します。操作後の文字列は bcda になります。次に、文字 b を末尾へ移動します。操作後の文字列は cdab となり、2番目の文字列と一致します。アルゴリズム基準となる文字列を1つ選びます(ここでは s

  6. C++で文字列を回文にするために必要な最小の追加文字数を求める方法

    問題文 文字列が与えられたとき、その文字列を回文にするために末尾へ追加する必要のある最小の文字数を求めます。 例 たとえば文字列が「abcac」の場合、2文字を追加して「abcacba」とすれば回文になります。 アルゴリズム 文字列がすでに回文であるかどうかを確認します。回文であれば、文字を追加する必要はありません。 文字列の先頭から1文字ずつ削除し、残りの文字列が回文になっているかどうかを確認します。 文字列が回文になるまで、上記の処理を繰り返します。 それまでに削除した文字数を、最終的な答えとして返します。 このアプローチのポイントは、「先頭から削除した文字数」がそのまま「末尾に追加

  7. 【C++】ちょうどK個のコップを満たすのに必要なボトルの最小本数を求める

    問題文 容量がそれぞれ与えられた N 個のコップに水を入れることを考えます。このとき、ちょうど K 個のコップを満たすために必要なボトルの最小本数を求めるのが課題です。なお、ボトル1本あたりの容量は 100 単位とします。 例 N = 5、K = 4、capacity[] = {1, 2, 3, 2, 1} の場合を見てみましょう。 容量の小さい方から4つのコップ(1, 1, 2, 2)を選ぶと、必要な水の総量は 6 単位になります。 ボトル1本の容量は 100 単位あるため、わずか 1 本のボトルで十分です。 アルゴリズム この問題は貪欲法を用いることで効率的に解けます。 ちょうど

  8. C++で有効な括弧列にするために追加すべき括弧の最小数

    問題文 開き括弧「(」と閉じ括弧「)」のみで構成された文字列が与えられます。この文字列を有効な括弧列(すべての括弧が正しく対応している状態)にするために、追加が必要な括弧の最小個数を求めてください。 例 str = ((() の場合、末尾に閉じ括弧「))」を2つ追加して ((())) とすれば有効な括弧列になります。したがって答えは 2 です。 アルゴリズム 単純に「開き括弧の総数と閉じ括弧の総数の差の絶対値」を答えとする方法は、)( のように閉じ括弧が開き括弧より先に現れるケースで誤った結果(0)を返してしまうため注意が必要です。正しく求めるには、文字列を先頭から走査しながら対応する相手を持

  9. C++で最初のN個の数値の順列を昇順ソートするための最小プレフィックス反転回数

    概要1からNまでの数値の順列からなる長さNの配列が与えられます。1回の操作では、配列の任意のプレフィックス(先頭部分)を反転することができます。このとき、配列を昇順にソートするために必要な最小の操作回数を求めるのが課題です。例配列が {1, 2, 4, 3} の場合、昇順にソートするには最小で3ステップが必要です。配列全体を反転 → {3, 4, 2, 1}先頭の2要素を反転 → {4, 3, 2, 1}配列全体を反転 → {1, 2, 3, 4}アルゴリズム与えられた数値を文字列としてエンコードします。さらに、配列をソートした結果も文字列としてエンコードし、これを目標文字列(destinat

  10. C++でY以下となる数値集合の最小個数を求めるアルゴリズム

    問題の概要連続した数字からなる文字列と数値 Y が与えられます。このとき、以下のルールをすべて満たす集合の最小個数を求めるのが課題です。各集合は、元の文字列から連続して取り出した数字で構成すること同じ桁(文字)を複数回使用してはならない集合内の数値は Y を超えてはならない入力例と出力例たとえば、str = 1234、Y = 20 とすると、次のように 3 つの集合に分割できるため、答えは 3 になります。{12}, {3}, {4}{12} は 20 以下であり、{3} と {4} もそれぞれ 20 以下です。すべての数字が一度ずつ使われていることも確認できます。アルゴリズムこの問題は貪欲法

  11. C++で合計がNになる1桁の素数の最小個数を求める方法

    問題の概要与えられた整数 N に対して、合計がちょうど N となるように必要な「1桁の素数」の最小個数を求めます。1桁の素数は 2、3、5、7 の4種類のみです。例たとえば N = 9 の場合、7 と 2 の2つの素数を足せば合計が 9 になるため、答えは 2 となります。解き方:動的計画法(DP)この問題は、いわゆる「コイン問題」とよく似た構造を持っています。合計値を金額、素数をコインと見立てて最小枚数を求めるのと同じ考え方で解くことができます。配列 arr[i] には「合計 i を作るために必要な素数の最小個数」を格納します。まず到達不可能を表す大きな値で全体を初期化し、arr[0]・ar

  12. C++で平方フリー約数の最小個数を求める方法

    問題文 整数 N が与えられます。「平方フリー約数(完全平方数ではない約数)」のみを使って N を因数分解するとき、必要となる約数の最小個数を求めてください。 つまり、N の因数分解には、完全平方数とならない約数だけを使用する必要があります。 例 N = 24 の場合、平方フリーな因子は以下のように 3 つになります。 因数 = 2 × 6 × 2 アルゴリズム まず、N の平方根までのすべての素因数を求めます。 次に、N の平方根以下のすべての素因数について、それぞれ N における最大の冪指数を調べます(例:24 における 2 の最大冪指数は 3)。 ある素因数が N の中で 1 より大

  13. C++で最後に残るモンスターの最小体力を求める方法(GCDの活用)

    問題概要N体のモンスターが存在し、各モンスターは整数の初期体力 h[i] を持っています。体力が0より大きいモンスターは「生存している」とみなされます。各ターンでは、ランダムに選ばれたモンスターが別のランダムなモンスターを攻撃します。攻撃を受けたモンスターの体力は、攻撃した側のモンスターの体力と同じ値だけ減少します。このプロセスは、モンスターが1体だけ残るまで繰り返されます。このとき、最後に残ったモンスターの体力として考えられる最小値を求めてください。具体例入力配列が {2, 14, 28, 56} の場合、出力は 2 になります。これは、体力2のモンスターが残りの3体を攻撃し続けたとき、最後

  14. C++で配列を均等に分割するために挿入すべき最小の正の整数を求める方法

    問題概要 N個の正の整数からなる配列が与えられます。この配列内の任意の2つの要素の間に、ある正の整数を挿入したとき、左側の部分配列の合計と右側の部分配列の合計が等しくなるようにしたいと考えます。新しく挿入した整数は、左右どちらか一方の部分配列に含まれるものとします。本記事では、この条件を満たすために挿入すべき正の整数のうち、最小の値を求める方法を解説します。 具体例 たとえば、配列が {3, 2, 1, 5, 7, 10} の場合、答えは 6 になります。値 6 を 5 と 7 の間に挿入すると、左右の部分配列の合計は次のように一致します。 3 + 2 + 1 + 5 + 6 = 177 +

  15. C++で解く:配列とkが与えられたときの|ai + aj − k|の最小値とペアの個数を求める方法

    問題文n個の整数からなる配列と整数Kが与えられます。i ≠ j を満たす順序を区別しないペア {i, j} のうち、|ai + aj − k| の絶対値が最小となるようなペアの総数を求めてください。例例として、arr[ ] = {0, 4, 6, 2, 4}、k = 7 の場合を考えてみましょう。このとき最小値は 1 となり、以下の5つのペアが条件を満たします。{0, 6}, {4, 2}, {4, 4}, {6, 2}, {2, 4}アルゴリズム考え方はシンプルで、すべてのペアを列挙し、各ペアについて abs(ai + aj − K) の値が現在の最小値より小さいかどうかを確認します。判定結

  16. C++でX = P*A + Q*Bを満たす最小の正整数Xを求める方法

    問題文AとBの値が与えられたとき、次の式を満たす最小の正整数Xを求めることを考えます。X = P*A + Q*Bここで、PとQは「0または任意の正・負の整数」を取ることができます。つまり、AとBをそれぞれ何倍かして足し合わせた結果の中から、最も小さい正の整数を見つける問題です。例A = 2、B = 4 の場合、答えは 2 になります。たとえば P = 1、Q = 0 とすると X = 2*1 + 4*0 = 2 となり、これより小さい正の整数は作れないため、答えは2です。アルゴリズムこの問題は、ベズーの等式(Bézouts identity)と呼ばれる数論の定理を使うことで解くことができます。

  17. C++でクイズゲームに勝つために必要な最小プレイヤー数を求める方法

    問題文 N問の質問があり、それぞれの質問にはK個の選択肢が用意されています(1 <= N <= 1000000000、1 <= K <= 1000000000)。この問題では、1番目から順にすべての問題をクリアしていき、なんとかしてゲームに勝つために必要な「各問題に挑戦したプレイヤー数の総和」の最小値を求めます。ただし、答えは109+7で割った余りとして出力してください。 重要なルールとして、一度でも誤答をするとそのプレイヤーは即座に脱落してしまう点に注意しましょう。 例 N = 5、K = 2 の場合、答えは 62 となります。 アルゴリズム N番目の問題を解

  18. C++で解く:合計が指定値以下となる最大サイズ2の最小セット数

    問題概要正の整数からなる配列 arr[] が与えられたとき、次の条件を満たす「セット」の最小数を求める問題です。1つのセットに含められる要素は最大2つまでです。2つの要素は配列内で隣接している必要はありません。セット内の要素の合計は、与えられたキー(Key)以下でなければなりません。なお、キーは配列内の最大要素以上であると仮定できます。例たとえば、arr[] = {1, 2, 3, 4}、k = 5 が与えられた場合、次の2つのペアを作成できます。{1, 4} と {2, 3}このように、4つの要素を合計が5以下になるペア2つに分割できるため、答えは「2」となります。アルゴリズムこの問題は、貪

  19. C++で配列全体のXORを0にするための最小操作回数を求めるアルゴリズム

    問題文n個の要素からなる配列が与えられます。この問題の目標は、配列全体のXORを0にすることです。そのために、次のような操作を行うことができます。まず、配列から任意の1つの要素を選択します。要素を選択した後、その要素を1増やす(インクリメント)か、1減らす(デクリメント)ことができます。配列全体のXORの合計を0にするために、選択した要素に対して必要な増減操作の最小回数を求めます。例arr[] = {2, 4, 7} の場合、必要な操作は1回だけです。要素「2」を選択します。これを1増やします。配列は {3, 4, 7} となり、そのXORは 3 ^ 4 ^ 7 = 0 になります。アルゴリズ

  20. C++で集合のMEXをxに一致させるための最小操作回数を求める方法

    問題文n個の整数からなる集合が与えられます。要素の挿入・削除を最小回数の操作で行い、集合のMEXを指定された値xに一致させてください。注: 整数の集合におけるMEXとは、その集合に含まれていない最小の非負整数のことです。例えば、集合 {0, 2, 4} のMEXは 1、集合 {1, 2, 3} のMEXは 0 となります。入出力例n = 5、x = 3、配列が {0, 4, 5, 6, 7} の場合、必要な最小操作回数は 2 回です。アルゴリズム最終的な集合では、「x 未満の要素がすべて存在すること」「x 自体は存在しないこと」が求められ、x より大きい要素はいくつあっても構いません。この性質

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:95/300  20-コンピューター/Page Goto:1 89 90 91 92 93 94 95 96 97 98 99 100 101