C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で解く「最大等頻度」問題:1要素削除後に頻度が揃う最長接頭辞の求め方

    正の整数からなる配列 nums が与えられたとき、その配列の接頭辞(先頭からの連続する部分配列)の中で、「そこからちょうど1つの要素を削除した後に、出現するすべての数値の頻度が等しくなる」という条件を満たす、最も長い接頭辞の長さを返すことを考えます。なお、要素を1つ削除した結果として残りの要素が空になった場合でも、すべての数値の頻度が等しい(すべて0)とみなされます。 例えば、入力が [3,3,2,2,6,4,4,6] の場合、答えは 7 になります。インデックス4にある要素 6 を削除すると、接頭辞は [3,3,2,2,4,4] となり、すべての要素がちょうど2回ずつ出現するためです。 ア

  2. C++で解くジョブスケジューリング問題:重複しないタスク選択による最大利益の求め方

    問題の概要n個の異なるタスクがあるとします。各タスクiは startTime[i] から endTime[i] まで実行され、完了すると profit[i] の利益が得られます。startTime・endTime・profit の3つのリストが与えられたとき、実行時間帯が互いに重ならないようなタスクの部分集合の中で、得られる利益の合計が最大になる値を求めてください。なお、あるタスクが時刻Xに終了する場合、同じ時刻Xに開始する別のタスクを選ぶことは可能です(終了時刻と開始時刻が一致していても重複とはみなしません)。入力例startTime = [1,2,3,3]、endTime = [3,4,5

  3. C++で長方形を最小数の正方形でタイリングする方法

    n × m のサイズの長方形が与えられたとき、その長方形を隙間なく覆うために必要な「整数の辺を持つ正方形」の最小個数を求める問題を考えてみましょう。たとえば、入力が n = 2、m = 3 の場合は次のようになります。この場合の出力は 3 です。2 × 3 の長方形を完全に埋めるには、3つの正方形ブロックが必要になるためです。アルゴリズムの流れこの問題は、深さ優先探索(DFS)をベースに、枝刈りとメモ化を組み合わせることで効率的に解くことができます。各時点での盤面の状態を「各列に積み上がった高さ」として管理し、最も低い列に正方形を置いていくのがポイントです。具体的な手順は以下の通りです。探索済

  4. C++で配列が「良い配列(Good Array)」かどうかを判定する方法

    問題の概要正の整数からなる配列 nums が与えられたとします。この中から任意の部分集合を選び、各要素に整数(負の値も可)を掛け合わせたうえで、それらをすべて足し合わせます。どのような部分集合や係数の組み合わせを選んでも合計を 1 にできるとき、その配列は「良い配列(good array)」であると定義されます。つまり、この記事の課題は、与えられた配列が良い配列かどうかを判定することです。例として、入力が [12, 23, 7, 5] の場合を考えてみましょう。このとき出力は True になります。なぜなら、5 と 7 を選べば 5×3 + 7×(−2) = 1 という計算が成立するからです。

  5. C++で与えられた文字から形成できる最大スコアの単語集合を求める方法

    問題の概要単語のリスト、使用できる1文字ずつの文字リスト、そして各文字ごとのスコアが与えられます。このとき、与えられた文字を使って作成できる有効な単語の集合の中から、合計スコアが最大になる組み合わせを見つける必要があります。すべての文字を使い切る必要はなく、また各文字は1回しか使用できません。文字「a」「b」「c」…「z」のスコアは、それぞれ score[0]、score[1]、…、score[25] として与えられます。たとえば、words = ["god", "good", "toc", "c

  6. C++で解く最小遺伝子変異問題:BFSによる最短変異回数の求め方

    長さ8の遺伝子文字列を考えます。この文字列は「A」「C」「G」「T」の4種類の文字のみで構成されています。ここでいう1回の突然変異とは、遺伝子文字列内のたった1文字を別の文字へ変更することを指します。たとえば、「AACCGGTT」を「AACCGGTA」へ変更するのは1回の変異に相当します。 さらに、有効な遺伝子変異をすべて格納した「遺伝子バンク」が与えられます。ある遺伝子が有効な文字列として認められるためには、必ずこのバンクに含まれていなければなりません。 課題は、「start(開始遺伝子)」「end(目標遺伝子)」「bank(遺伝子バンク)」の3つが与えられたとき、startからendへ到達

  7. C++で総ハミング距離を求める:全ペアのビット差を効率的に計算する方法

    数値のリストが与えられたとき、リスト内のすべてのペアに対するハミング距離の合計(総ハミング距離)を求めることを考えます。ハミング距離とは、2つの整数を比較した際に、対応するビットが異なる位置の個数のことです。 たとえば、入力が [4, 14, 17, 2] の場合、出力は 17 となります。 解法のアプローチ すべてのペアを総当たりで比較すると計算量が膨大になるため、ここではビット位置ごとに着目する効率的な手法を紹介します。 あるビット位置 j に注目したとき、それまでに処理済みの数値の中で「現在の数値と逆のビット値を持つもの」の個数を順次加算していけば、最終的に全ペアのハミング距離の合計が求

  8. C++で無向グラフの辺(エッジ)の数を数える方法

    無向グラフと辺の数を数える問題今回の課題は、無向グラフに含まれる辺の数を数えることです。無向グラフとは、複数の頂点(ノード)を双方向の辺で結んで構成されるグラフのことで、あるノードから接続先のノードへ、どちらの方向にも移動できるのが特徴です。下図は無向グラフを視覚的に表したものです。この問題では、与えられた無向グラフの中に辺が何本あるかを求めます。グラフにおける辺とは、2つの頂点を結ぶ線のことです。入力:insert(graph_list, 0, 1); insert(graph_list, 0, 2); insert(graph_list, 1, 2); insert(graph_list,

  9. C++で連結リスト内の最小頻度要素をカウントする方法

    はじめに本記事では、重複する要素を含む連結リスト(リンクリスト)が与えられたときに、最小頻度の要素をカウントする方法について解説します。連結リストとは、データを順番に格納するデータ構造の一種で、リストのように各要素が次の要素へと順次連結された形をしています。連結リストにおける要素の出現頻度とは、その要素がリスト内に出現する回数のことを指します。今回の問題では、連結リスト内で最も出現回数が少ない頻度(最小頻度)を求め、それに該当する要素をカウントする必要があります。例えば、1, 1, 3, 1, 3, 4, 6 という連結リストを考えてみましょう。この場合、最小頻度は1であるため、最小頻度を持つ

  10. C++ STL入門:setとunordered_setの違いを徹底解説

    本記事では、C++ STLにおける set と unordered_set の概要をわかりやすく解説し、両者の違いについても詳しく学んでいきます。 setとは? set(セット)は、Key型の一意なオブジェクトをソート済みの状態で格納する連想コンテナです。各要素は一度しか出現できず、重複した値は許されません。ユーザーは任意の順序で要素を挿入してsetを作成できますが、setは常にソートされた形でデータを返します。つまり、setにはデータを並べ替えるための仕組みが内部に組み込まれており、その処理はユーザーから抽象化されています。 setを使うべき主なケースは以下の通りです。 ソート済みのデ

  11. Bootstrapのコンテナ入門:containerとcontainer-fluidの違いを徹底解説

    名前が示す通り、コンテナ(container)とは何かを保持したり束ねたりするためのものです。Bootstrapにおけるコンテナも同様に、ビューポート上のコンテンツを格納・管理する役割を担います。 コンテナは、ビューポートの四辺との間にマージンを設けることでコンテンツに余白(パディング)を与えます。この余白は、デザインのニーズに応じて自由に変更することも可能です。さらに、コンテナ同士を入れ子(ネスト)にして使うこともできます。 それでは、それぞれのクラスについて詳しく見ていきましょう。 .containerクラス Bootstrapの.containerクラスは、ビューポート内で固定幅を持

  12. 【C++】指定された周囲長から作れる長方形の最大面積を求める方法

    はじめに 長方形の周囲長が与えられたとき、その周囲長を持つ長方形として考えられる最大の面積を求めるのが本記事のテーマです。 長方形の周囲長と面積の基礎知識 長方形とは、向かい合う2組の辺がそれぞれ等しく平行な平行四辺形の一種です。 周囲長(外周)とは 長方形の周囲長とは、4つの辺の長さをすべて足し合わせたものであり、長方形の外側を一周したときの総距離とも言えます。 周囲長を求める公式:周囲長 = 縦 + 横 + 縦 + 横 = 2 ×(縦 + 横) 面積とは 一方、面積は長方形という図形の大きさ(広さ)を表します。 面積を求める公式:面積 = 縦 × 横 最大面積を求める考え方 与えられた周

  13. C++で特別な行列内のxと等しい要素の個数をカウントする方法

    正方行列 mat[][] が与えられ、その各要素は mat[i][j] = i*j として定義されているとします。このとき、行列内に存在する「x と等しい要素」の個数を求めることが本記事の課題です。行列とは、数値や要素を行(row)と列(column)の形式で表現する2次元配列のようなものです。画像処理やグラフ理論など、さまざまな分野で活用される基本的なデータ構造です。それでは、具体例を使いながらこの問題の解き方を確認していきましょう。入力例1matrix[row][col] = { {1, 2, 3}, {3, 4, 3}, {3, 4, 5}}; x = 3出力例1

  14. C++で指定された数値で割り切れるn桁の数をカウントする方法

    本記事では、2つの値、すなわち桁数を表す d と除数となる num が与えられたとき、「d 桁の整数のうち num で割り切れるもの」がいくつ存在するかを求める方法を解説します。たとえば d に 2 が入力された場合、まず対象となるのは 10〜99 のすべての2桁の整数です。その中から num で割り切れる数だけを抽出し、その個数を数えます。具体例を見てみましょう。例1入力: digit = 2, num = 12出力: 指定された数値で割り切れるn桁の数の個数:8説明: 12で割り切れる2桁の整数は、12, 24, 36, 48, 60, 72, 84, 96 の8個です。例2入力: dig

  15. C++で数値Nを割り切る桁の個数を数える方法

    整数 N が与えられ、その数値を構成する各桁のうち、元の数値 N を割り切るものの個数を求めることを考えます。 注意すべきポイント 桁が「0」である場合は無視します。つまり、0 に対してはカウントを増やしません。 同じ数字が複数回現れ、かつそれが数値を割り切る場合には、出現した回数だけカウントします。たとえば 2240 という数値の場合、0 以外のすべての桁が 2240 を割り切ることができ、2 は2回出現しているので、2 に関するカウントは 2 になります。 入力 − number = 2240 出力 − カウントは 3 説明 − 数値を桁に分解すると 2、2、4、0 となります。

  16. C++で特定の数字を含まないn桁の数をカウントする方法

    問題概要 本記事では、次のような問題をC++で解く方法を解説します。 整数 n(桁数)と特定の1桁の数字 digit が与えられます。このとき、「指定された数字をひとつも含まない n 桁の数」が全部でいくつ存在するかを求めるのがゴールです。 入力例と出力例 入力: n = 2, digit = 2 出力: 72 説明: 2桁の数(10〜99)のうち、数字「2」を含まないものは 10, 11, 13, 14, 15, 16, 17, 18, 19, 30, 31, 33, ... などです。十の位は「2」以外の8通り、一の位は「2」以外の9通りから選べるため、全体で 8 × 9 = 72 個と

  17. C++でmatrix(i, j) = i+jとなるn×n行列内のkの出現回数をカウントする方法

    整数値で構成される行列が与えられ、その中に特定の整数 k が何回出現するかをカウントすることが課題です。行列のサイズは任意に設定できますが、本記事では 4×4 の行列を例に解説します。行列は matrix(i, j) = i + j という条件に基づいて生成され、インデックスは 0 から始まるため、matrix[0][0] = 0 となります。 入出力例 例1 入力: int size = 4, k = 4 出力: 4×4 の行列における 4 の出現回数は 3 説明: matrix[i][j] = i + j(i = j = 4) Matrix[4][4] = { 0, 1, 2,

  18. C++で頭と脚の数から動物園の動物の数を求める方法

    問題概要動物園にいる動物の頭の総数と脚の総数が与えられ、その情報をもとに動物園にいる動物の数を計算するのが課題です。以下のプログラムでは、動物を「シカ」と「クジャク」の2種類と仮定して考えていきます。入力:heads = 60legs = 200出力:シカの数:40クジャクの数:20解説:シカの総数を x、クジャクの総数を y とおきます。頭は動物1体につき1つしかないため、最初の式は次のようになります。x + y = 60シカの脚は4本、クジャクの脚は2本なので、2番目の式は次のようになります。4x + 2y = 200この連立方程式を解くと、4(60 - y) + 2y = 200240

  19. C++でソート済み行列内のx以下の要素数を数える方法

    概要n × n のサイズの行列と整数 x が与えられます。行列の各要素はソート済みの状態で配置されており、課題は「x 以下の値を持つ要素がいくつあるか」を求めることです。それでは、具体的な入出力例を見ていきましょう。入力例1matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {6, 7, 8}}、X = 4出力例1count is 4説明: 行列の各要素と x(= 4)を比較すると、x 以下となる要素は 1, 2, 3, 4 の 4 つです。したがって、カウントは 4 となります。入力例2matrix[3][3] = {{1, 2, 3}, {4, 5, 6}, {6,

  20. C++ですべての順列が元の数以上となる自然数の個数を数える方法

    自然数 num が与えられたとき、「桁をどのように並べ替えても元の数より小さくならない」自然数が num 以下にいくつ存在するかを求めるのがこの問題です。問題の条件扱うのは自然数のみとします。その数のすべての順列(桁の並べ替え)が、元の数と等しいかそれより大きくなければなりません。例:num = 20 の場合1から20までの数を順に調べてみましょう。1〜9 は一桁の数なので、並べ替えようがなく常に条件を満たします。 19)までは反転した数が必ず元の数以上になります。一方、10 や 20 は「01」「02」というように並べ替えると元の数より小さくなるため条件を満たしません。したがって該当するのは

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:182/300  20-コンピューター/Page Goto:1 176 177 178 179 180 181 182 183 184 185 186 187 188