C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で1からn-1の範囲に存在する唯一の重複要素を見つける方法

    問題概要この問題では、サイズNの順序が整列されていない整数配列 arr[] が与えられます。配列には 1 から N-1 までの値がすべて含まれており、そのうちの1つの値だけが2回出現しています。このとき、1からn-1までの範囲に存在する唯一の重複要素を見つけるのが課題です。具体例で問題を確認しましょう。入力:arr[] = {3, 5, 4, 1, 2, 1}出力:1この例では、配列内で「1」のみが2回出現しているため、答えは 1 となります。解法1:全探索(ブルートフォース)最もシンプルな解決策は、配列を走査しながら、各要素について配列内の他の位置に同じ値が存在するかどうかを調べることです。

  2. C++で線分のもう一方の端点を求める方法|一方の端点と中点から計算する

    問題概要この問題では、線分の一方の端点A(xA, yA)と中点M(xM, yM)の座標が与えられ、もう一方の端点Bの座標を求めることが課題となります。具体的な例で問題を確認しましょう。入力:A = [1, 2], M = [3, 0]出力:[5, -2]解説この線分は下図のように表されます。解法のアプローチこの問題は、数学で学んだ幾何学の知識を使えばシンプルに解くことができます。まず、線分の中点を求める基本公式を思い出しましょう。mid(x) = (x1 + x2) / 2 mid(y) = (y1 + y2) / 2しかし今回の問題では、中点の座標がすでに与えられており、むしろもう一方の端点

  3. C++で2つの配列の共通要素の合計を求める方法

    この問題では、すべての要素が互いに異なる(ユニークな値を持つ)2つの配列 arr1[] と arr2[] が与えられます。私たちのタスクは、2つの配列に共通して存在する要素の合計(オーバーラップサム)を求めることです。 問題の概要 両方の配列に出現する要素をすべて見つけ、その合計値を返します。共通要素は各配列に1つずつ存在するため、1つの共通要素につき値を2回加算することになります。 具体例で理解しよう 入力: arr1[] = {5, 4, 9, 2}, arr2[] = {6, 3, 9, 4} 出力: 26 解説 両方の配列に存在する要素は「9」と「4」です。 合計は 9 + 9 + 4

  4. C++で配列から最後に削除される要素の位置を求める方法

    この記事では、サイズ N の整数型配列 arr[] と整数値 M が与えられたときに、配列から最後に削除される要素の位置を求めるアルゴリズムを解説します。 問題の概要 配列から要素を削除する際には、以下のルールに従って操作を行います。 配列内の各要素 arr[i] について、arr[i] > M の場合はその値をいったん取り出し、arr[i] − M を配列の末尾へ追加します。 arr[i] ≤ M の場合は、その要素を配列から削除します。 この操作を、配列が空になるまで繰り返します。 具体例で問題を理解する 入力: arr[] = {5, 4, 8}, M = 3

  5. C++で2つの方程式を使って重複する数と欠落した数を見つける方法

    この問題では、サイズNの配列arr[]が与えられます。配列には1からNまでの範囲の整数が含まれていますが、ある要素xが1つ欠落しており、その代わりに別の要素yが2回出現しています。私たちのタスクは、2つの方程式を立てて連立方程式を解くことで、重複している数と欠落している数を見つけることです。 問題の例 入力: arr[] = {1, 2, 3, 3} 出力: 欠落している数 = 4、重複している数 = 3 解法のアプローチ この問題は、欠落している数xと重複している数yについて2つの方程式を立て、それらを連立させて解くことで求められます。それぞれの方程式の導き方を見ていきましょう。 方程式1:

  6. C++で1の数が最も多い行を見つけるアルゴリズム

    この問題では、各行の要素が昇順にソートされたバイナリ行列(0と1のみで構成される行列)が与えられます。私たちの課題は、1の数が最も多い行を見つけることです。 問題の例 入力: mat[][] = {{0 1 1 1}    {1 1 1 1}    {0 0 0 1}    {0 0 1 1}} 出力: 1 説明: 行列の各行に含まれる1の個数: 行 0 : 3 行 1 : 4 行 2 : 1 行 3 : 2 解法アプローチ この問題に対するシンプルな解決策は、「最初の1が出現するインデックスが最小の行」

  7. N番目の非フィボナッチ数を求めるC++プログラム

    問題概要この問題では、整数値 N が与えられ、C++ を使って N 番目の非フィボナッチ数を求めることが課題となります。フィボナッチ数列とは、直前の2つの数を足し合わせることで次の数を生成していく数列です。数列は F0 と F1 の2つの初期値から始まり、初期値としては 0, 1(または 1, 1)がよく用いられます。入出力例入力:N = 5出力:10解法アプローチ最もシンプルな解法は、まずフィボナッチ数をすべて求めておき、フィボナッチ数に含まれない数を先頭から順に数えていく方法です。もう一つの効率的な解法として、フィボナッチ数の性質を利用し、隣り合うフィボナッチ数同士の「間隔(ギャップ)」を

  8. 【C++】数列 14, 28, 20, 40, … のN番目の項を求める方法を解説

    問題概要 この記事では、整数値 N が与えられたとき、以下の数列の N番目の項 を求める方法を解説します。 14, 28, 20, 40, 32, 64, 56, 112, … 具体例 入力: N = 6 出力: 64 このように、N = 6 の場合は数列の6番目の項である「64」が出力されます。 解法アプローチ 数列のN番目の項を求めるには、まず数列の一般項(規則性)を見つける必要があります。数列を注意深く観察すると、大きく分けて2つのアプローチがあることがわかります。 方法1: 奇数位置と偶数位置の2つの数列に分解する この数列は、奇数番目の項からなる数列と、偶数番目の項からなる数列が交互

  9. C++でN個の範囲の中で最も多く出現する整数を求める方法

    問題概要 この問題では、N個の範囲(区間)が与えられ、その中で最も多く出現する整数を見つけることが課題となります。 各範囲には開始値と終了値が指定されており、これらすべての範囲を通して、最も多くの範囲に含まれる値を特定します。 入出力例 入力: S1 = 1, E1 = 3 S2 = 2, E2 = 6 S3 = 3, E3 = 4 出力: 3 この例では、整数「3」が範囲 [1,3]、[2,6]、[3,4] のすべてに含まれており、合計3回出現するため、答えは 3 となります。 解法アプローチ 1. ハッシュテーブルを使う方法 最もシンプルな解法はハッシュ(連想配列)を利用する方法です。ハ

  10. C++でソート済み配列から「kより大きい要素」の個数を求める方法

    この問題では、N個のソート済み整数からなる配列 arr[] と整数 k が与えられます。目的は、配列内で k より大きい要素の個数を求めることです。問題例入力arr[] = {1, 2, 5, 7, 8, 9}、k = 4出力4説明k = 4 より大きい要素は 5, 7, 8, 9 の4つ解法1:線形探索(シンプルな方法)最も単純な解法は、配列の先頭から末尾までループで走査し、k より大きい最初の要素が見つかった時点で処理を止める方法です。その位置以降に残っている要素の数が、求める個数となります。実装例#include <iostream> using namespace std;

  11. 【C++】合計がKとなる最小個数のフィボナッチ数を求める方法

    この記事では、数値Kが与えられたときに合計がKに等しくなる最小個数のフィボナッチ数を求める問題について解説します。フィボナッチ数列とはフィボナッチ数列とは、直前の2つの数を足し合わせることで次の数を生成していく数列です。数列はF0とF1という2つの初期値から始まり、一般にF0=0、F1=1(またはF0=1、F1=1)が用いられます。フィボナッチ数列は「0, 1, 1, 2, 3, 5, 8, 13 …」のように続きます。問題の例入力:K = 5出力:2説明:5は 3 + 2 の合計で表すことができます。解き方のアプローチ1自体がフィボナッチ数であるため、フィボナッチ数の組み合わせによって任意の

  12. C++で数値の傾きを求めるアルゴリズムを解説

    問題の概要 この記事では、ある数値 N が与えられたときに、その「傾き(スロープ)」を求める方法をC++で解説します。 数値の傾きとは? 数値の傾きとは、その数値に含まれる極大桁(maxima)と極小桁(minima)の合計数のことを指します。 極大桁:直前と直後の両方の隣接する桁よりも大きい桁 極小桁:直前と直後の両方の隣接する桁よりも小さい桁 なお、先頭と末尾の桁には隣接する桁が2つ存在しないため、判定対象からは除外されます。 具体例で理解しよう 入力: N = 9594459 出力: 2 この例では、2番目の桁「5」が両隣の「9」よりも小さい極小桁、3番目の桁「9」が両隣の「5」

  13. 【C++】指定した要素を削除した後に最小値を見つける方法

    この記事では、2つの配列 arr[] と del[] が与えられたときに、del[] に含まれる要素を arr[] から削除した後の最小値を見つける問題を解説します。 具体的には、arr[] の値のうち del[] にも存在するものを取り除き、削除後の配列における最小値を出力します。なお、重複した値については del[] に出現する回数分だけ削除され、それ以外は残る点に注意が必要です。 例で問題を確認しよう 入力: arr[] = {2, 5, 6, 9, 1} del[] = {1, 5, 9} 出力: 2 この例では、arr[] から 1・5・9 が削除されるため、残った値の中で最も

  14. C++で解く掃除ロボット問題:グリッド上で清掃できる汚れセルの最大数を求める方法

    問題概要h × w のサイズを持つグリッド上で動作する掃除ロボットを開発することを考えてみましょう。グリッドには m 個の汚れたセルがあり、それらは整数ペアの配列 dirt として与えられます。この掃除ロボットには特別な機能があり、特定のセルに配置すると、そのセルが属する「行」と「列」のすべてのセルを一度に掃除できます。私たちのタスクは、ロボットを最適な位置に配置したときに、最大で何個の汚れたセルを掃除できるかを求め、その数を出力することです。例えば、入力が h = 3、w = 3、m = 3、dirt = {{0, 0}, {1, 1}, {2, 1}} の場合、出力は 3 になります。これ

  15. ロボットがグリッド内を移動する際の総コストを求めるC++プログラムの解説

    問題の概要 縦 h × 横 w のグリッドが与えられ、各マスには正の整数が書かれています。このグリッド上には経路探索ロボットが配置されており、あるマス (p, q)(p は行番号、q は列番号)から別のマス (i, j) へ移動できます。1 回の移動にかかるコストは |p − i| + |q − j| として定義されます。 さらに、次のような性質を持つ q 回の移動(トリップ)が与えられます。 各トリップは 2 つの値 (x, y) を持ち、すべてのトリップで共通の値 d が使われます。 ロボットは値 x が書かれたマスに出発し、値 x + d が書かれた別のマスへ移動します。 その後も値

  16. 行と列の入れ替えで生成可能な一意な行列の数を求めるC++プログラム

    問題の概要 サイズ n x n の行列が与えられます。各要素は一意であり、1 から n2 までの整数です。 以下の操作を任意の回数、任意の順序で実行できます。 列の入れ替え: 2つの列インデックス x, y (1 ≤ x < y ≤ n) を選び、それらの列を入れ替える。ただし、全ての行 i について mat[i][x] + mat[i][y] ≤ k を満たす必要があります。 行の入れ替え: 2つの行インデックス x, y (1 ≤ x < y ≤ n) を選び、それらの行を入れ替える。ただし、全ての列 j について mat[x][j] + mat[y][j] ≤ k を満たす必要が

  17. C++で解く!ロボットがグリッド上の目的地セルへ到達するための最小ジャンプ回数を求める方法

    h × w のサイズを持つグリッドを考えてみましょう。このグリッドは2次元配列「initGrid」で表され、各セルは「#」または「.」のいずれかで構成されています。「#」はそのセルに障害物があることを意味し、「.」はそのセルを通って移動できることを示します。 ここで、行番号 x・列番号 y のセル c にロボットを配置します。ロボットは、行番号 p・列番号 q にある別のセル d へ移動しなければなりません。セル c と d の座標は、いずれも整数ペアとして与えられます。 ロボットは、以下のルールに従ってセル間を移動できます。 移動先のセルが現在いるセルの上下左右に隣接している場合、歩いて移

  18. C++で全ての3D座標を巡回する最小移動コストを求めるプログラム

    問題概要n 個の三次元座標が与えられます。ある座標 (a, b, c) から別の座標 (x, y, z) へ移動するときのコストは、次の式で定義されます。|x − a| + |y − b| + max(0, z − c)この式のポイントは、max(0, z − c) の部分です。z 軸方向の移動では「上方向へ登る場合のみ」追加コストが発生し、水平方向や下方向への移動にはコストがかかりません。私たちは最初の座標から出発し、すべての座標を少なくとも一度ずつ訪問した後、再び出発点である最初の座標へ戻ります。この一連の旅全体にかかる合計コストの最小値を求めるのが目的です。座標は配列 coords とし

  19. C++で解く最小連結グラフの最大合計スコアの求め方

    問題の概要「最小連結グラフ」とは、どの辺を1本でも取り除くとグラフが連結でなくなってしまう(分断されてしまう)グラフのことです。言い換えれば、このグラフは木構造と同じ性質を持ちます。ここでは、n個の頂点を持つ最小連結グラフが与えられ、辺の情報は配列 edges として渡されます。あわせて、n個の整数値を格納した配列 vertexValues も与えられます。次に、以下の操作を行います。各頂点に正の整数を1つ書き込みます。2つの頂点をつなぐ辺には、その両端の頂点に書かれた値のうち小さい方を記録します。すべての辺に書かれた値を合計したものを「スコア」とします。目的は、頂点への値の割り当て方を工夫す

  20. C++で作成できる座標ペアの数を求めるプログラム

    問題概要2次元平面上に与えられた2n個の座標点を考えます。これらの座標は、coordAとcoordBという2つの配列に分けられており、各座標は整数のペアで表されます。ここで、coordAから1点、coordBから1点を選んでペアを作ることを考えます。ペアを作成できるのは、coordA側の点のx座標がcoordB側の点のx座標より小さく、かつcoordA側の点のy座標がcoordB側の点のy座標より小さい場合のみです。さらに、1つの点が複数のペアに属することはできないものとします。このとき、作成できるペアの総数を求めます。例として、入力が n = 3、coordsA = {{1, 3}, {2,

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:287/300  20-コンピューター/Page Goto:1 281 282 283 284 285 286 287 288 289 290 291 292 293