C++

 Computer >> コンピューター >  >> プログラミング >> C++
  1. C++で配列の指定範囲とのXOR合計が最大となる数を見つける方法

    この記事では、配列と複数のクエリが与えられる問題を解きます。各クエリでは区間(L, R)が指定され、その区間内の各要素とxとのXORの合計が最大になるような数xを見つける必要があります。具体例を見てみましょう。入力 : A = {20, 11, 18, 2, 13} 3つのクエリを (L, R) ペアとして与える 1 3 3 5 2 4 出力 : 2147483629 2147483645 2147483645この問題では、まず各ビット位置ごとに「1」が出現する回数の累積和(プレフィックスカウント)を求めておきます。事前に1の個数を計算していれば、クエリで指定された区間L〜Rに含まれる1の個数

  2. C++で解く:配列全体とのXOR和が指定した数kになる値を求める方法

    問題の概要本記事では、与えられた配列とある数とのXOR(排他的論理和)の合計が、指定された数kと等しくなるような「その数」を求める問題を解説します。まず、具体的な例を見てみましょう。入力: arr[] = {1, 2, 3, 4, 5}, k = 10 出力: 11 説明: 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 11 = 10 入力: arr[] = {12, 23, 34, 56, 78}, k = 6 出力: 73このように、配列内のすべての要素と答えとなる数をXORした結果がkになる値を導き出すのが目的です。解法の鍵となるXORの性質この問題を効率的に解くには、XOR演算子が持つ重要

  3. 指定した数字根を持つ範囲内の数を効率的に見つけるC++プログラム

    数字根(デジタルルート)とは、ある数の各桁の合計を求め、その結果が1桁になったときの値のことです。このチュートリアルでは、数の範囲と1桁の整数Xが与えられ、その範囲内で数字根がXと一致する数の個数を数える問題について解説します。入力: l = 13, r = 25, X = 4 出力: 2 説明: 範囲(13, 25)内で桁の合計が4になる数は13と22の2つです。 入力: l = 11, r = 57 出力: 6解法のアプローチ単純なアプローチ最もシンプルな方法は、lからrまでのすべての数を順番に走査し、それぞれの桁の合計がXと一致するかどうかを確認することです。しかし、この方法では範囲内

  4. C++で少なくとも1つの非空部分配列のビット単位ANDとなる数値をすべて求める方法

    本記事では、「与えられた配列に対して、少なくとも1つの非空(空でない)部分配列のビット単位ANDとして表現できるすべての整数を求める」という問題を解説します。具体的な入出力の例は以下の通りです。入力:nums[ ] = { 3, 5, 1, 2, 8 } 出力:{ 2, 5, 0, 3, 8, 1 } 説明: 2 は部分配列 {2} のビット単位AND, 5 は部分配列 {5} のビット単位AND, 0 は部分配列 {1, 2}、{2, 8}、{1, 2, 8} のビット単位AND, 3 は部分配列 {3} のビット単位AND, 8 は部分配列 {8} のビット単位AND, 1 は部分配列 {

  5. 【C++】動的計画法で最大の割り切れるペアの部分集合を見つけるプログラム

    問題の概要互いに異なる要素から構成される配列が与えられます。この中から、すべてのペアが割り切れる関係にある部分集合(サブセット)を見つけるのが課題です。つまり、部分集合内のどの大きい要素も、それより小さいすべての要素で割り切れる必要があります。入力 : arr[] = {10, 5, 3, 15, 20} 出力 : 3 説明 : 最大の部分集合は {10, 5, 20} です。 10は5で割り切れ、20は10で割り切れます。 入力 : arr[] = {18, 1, 3, 6, 13, 17} 出力 : 4 説明 : 最大の部分集合は {18, 1, 3, 6} です。 この列では、3は1で

  6. 配列内で最大の割り切り可能なサブセットを見つけるC++プログラム

    はじめに本チュートリアルでは、互いに異なる正の整数からなる配列が与えられたとき、任意の2つの要素について「大きい方が小さい方で割り切れる」という条件を満たす、最大のサブセットを見つける問題を解説します。入力: nums[ ] = { 1, 4, 2, 6, 7} 出力: 1 2 4 説明: 割り切り可能なサブセットには (1, 2, 4)、(1, 2, 6)、(1, 7) などがあります。 条件を満たすペアを持つ長さ3のサブセットが2つ存在します。 入力: nums[ ] = { 1, 2, 3, 6 } 出力: 6 2 1解決策へのアプローチ本チュートリアルでは、2つの異なるアプローチにつ

  7. C++で1と0の数が等しい最大の部分木を求めるアルゴリズム

    問題の概要0と1のみで構成された二分木が与えられます。この課題は、1と0の数が等しい最大の部分木を見つけることです。解決のためのアプローチこのアプローチでは、値が0であるすべてのノードを-1に置き換えます。こうすることで、「合計が0に等しい最大の部分木を見つける」という問題に帰着でき、プログラムが大幅にシンプルになります。実装例上記アプローチのC++コード #include <iostream> using namespace std; int maxi = -1; struct node { // ツリーノードの構造体     int data;  

  8. すべてのペアの和が素数となる最大の部分集合を求めるC++プログラム

    問題概要与えられた配列の中から、すべてのペアの合計が素数となる最大の部分集合を見つける方法を解説します。ここでは、要素の最大値は100000であると仮定します。まず、以下の例を見てみましょう。入力: nums[ ] = { 3, 2, 1, 1 }出力: size = 3, subset = { 2, 1, 1 }説明:作成可能な部分集合は {3, 2}、{2, 1}、{2, 1, 1} です。{2, 1, 1} の場合、ペア (2, 1) の合計は 3 で素数であり、ペア (1, 1) の合計も 2 で素数となっています。入力: nums[ ] = {1, 4, 3, 2}出力: size

  9. C++で二分木の葉ノードをペアごとに入れ替える方法

    二分木が与えられたとき、その葉ノードをペアごとに入れ替えることが課題です。例えば、次のような入出力が考えられます。 入力: 出力: 本記事では、隣接する2つの葉ノードを指す2つのポインタを管理しながら、それらの値を順番に入れ替えていく方法を解説します。 解法のアプローチ このアプローチでは、木を走査して葉ノードを見つけると同時に、カウンタで現在の葉ノードの個数を追跡します。ポイントとなるのは次のロジックです。 カウンタが奇数のとき:まだペアの片方しか見つかっていないため、1つ目のポインタをそのノードに向ける。 カウンタが偶数のとき:ペアが揃ったことになるので、2つのノードのデータを入れ

  10. C++で連結リストの要素をペアごとに入れ替える方法(反復法・再帰法)

    本記事では、連結リスト内のノードをペアごとに入れ替え、その結果を出力する問題の解き方を解説します。問題の例入力 : 1->2->3->4->5->6->NULL出力 : 2->1->4->3->6->5->NULL入力 : 1->2->3->4->5->NULL出力 : 2->1->4->3->5->NULL入力 : 1->NULL出力 : 1->NULLこの問題には主に2つのアプローチがあり、どちらも計算量は O(N)(N は連結リストのサイズ)です

  11. C++で特定の基数におけるパンデジタル数を判定する方法

    ある基数Bにおいて、0から基数Bまでのすべての数字を含む数は、その基数における「パンデジタル数」と呼ばれます。ただし、0を含まず1から9までの数字だけで構成される数は、「ゼロなしパンデジタル数」と呼ばれます。パンデジタル数の例としては、0123456789 や 0789564312 などが挙げられます。 問題の概要 このチュートリアルでは、数値と基数が与えられたとき、その数値が指定された基数においてパンデジタル数であるかどうかを判定する問題を取り上げます。以下に入力例と出力例を示します。 入力: num = 9651723467380AZ, base = 10 出力: YES 説明: numに

  12. C++で連結リストを指定した値を基準に分割し、元の順序を維持する方法

    このチュートリアルでは、連結リストが与えられたとき、xより小さい数値をすべてリストの先頭側に集め、それ以外の数値を後ろ側に配置する方法を解説します。その際、各グループ内の要素の相対的な順序は元のまま維持しなければならない点がポイントです。 入力 : 1->4->3->2->5->2->3, x = 3 出力 : 1->2->2->3->3->4->5 入力 : 1->4->2->10 x = 3 出力 : 1->2->4->10 入力 : 10->4->20->1

  13. C++で数値を2つの割り切れる部分に分割する方法

    この問題では、数値として解釈できる文字列が与えられます。この文字列を2つの部分に分割し、前半部分が整数Aで割り切れ、後半部分が整数Bで割り切れるようにする必要があります。以下に入力例と出力例を示します。入力 : str = 123, a = 12, b = 3 出力 : YES 12 3 「12」はaで割り切れ、「3」はbで割り切れます。 入力 : str = 1200, a = 4, b = 3 出力 : YES 12 00 入力 : str = 125, a = 12, b = 3 出力 : NO本記事では、事前計算(前処理)を活用してプログラムを高速化し、より大きな入力サイズでも十分

  14. 二分木で屈曲数が最大となるパスの長さを求めるC++プログラム

    本記事では、二分木が与えられたときに、屈曲数が最大となるパスを求める問題を解いていきます。ここで「屈曲(ベンド)」とは、パスの進行方向が左から右へ、または右から左へと切り替わる箇所のことです。具体例を見てみましょう。入力 −出力 −6この方法では、木を走査しながら直前の移動方向を記録していきます。方向が変化した時点で屈曲数を加算し、最終的にその最大値を求めます。解法のアプローチこのアプローチでは、すべてのパスを辿り、各パスにおける屈曲の総数を計算します。葉ノードに到達した時点で、これまでの屈曲数が現在の最大値を上回っていれば、答えとパスの長さを新しい値に更新します。C++による実装例#incl

  15. C++で平均値が最大となるパスを求める方法

    問題の概要 この問題では、2次元行列が与えられ、その中から平均値が最大となるパスを見つける必要があります。パスの始点は必ず左上のセル、終点は右下のセルです。具体的には以下のような例になります。 入力 : Matrix = [1, 2, 3 4, 5, 6 7, 8, 9] 出力 : 5.8 平均値が最大となるパスは、1 -> 4 -> 7 -> 8 -> 9 パスの合計は 29、平均は 29/5 = 5.8 この問題では、移動は「右」または「下」の2方向のみが許されています。この制約があるおかげで問題は

  16. C++で五胞体数(ペンタトープ数)を求める方法

    五胞体数とは? 五胞体数(ペンタトープ数)は、パスカルの三角形の第5の対角線上に現れる数列として知られています。この数列を定義するには、パスカルの三角形に少なくとも5つの数が必要となるため、数列の最初の数はパスカルの三角形の第4行である 1 4 6 4 1 から始まります。 本チュートリアルでは、n番目の五胞体数を求める方法を解説します。まずは具体的な例を見てみましょう。 入力 : 1出力 : 1入力 : 4出力 : 35 以下の図から出力を確認できます。 この問題は数列に関するものなので、解法ではまず数列のパターンを見つけることから始めます。 解法のアプローチ このプログラムでは、数列の

  17. C++でヴァリニョンの平行四辺形の周囲長と面積を求める方法

    ヴァリニョンの平行四辺形(Varignons Parallelogram)とは、四角形の各辺の中点を順に結ぶことで形成される平行四辺形のことです。 四角形ABCDを考えてみましょう。各辺の中点をそれぞれP、Q、R、Sとします。これら4つの中点を結ぶと、必ず平行四辺形PQRSが形成されます。これが「ヴァリニョンの平行四辺形」と呼ばれるものです。 本記事では、四角形の2つの対角線の長さと面積が与えられたとき、ヴァリニョンの平行四辺形の周囲長と面積を求める方法を解説します。 入力例と出力例 入力: d1 = 6, d2 = 9, Area = 12 出力: 周囲長 = 15 面積 = 6 入力

  18. C++で解く配列の順列問題:別の配列より大きくなる位置を最大化する方法

    このチュートリアルでは、2つの配列 A と B が与えられたとき、A[i] > B[i] となるインデックスの数が最大になるように配列Aを並べ替えた順列を出力する方法を解説します。まずは具体例を見てみましょう。 入力: A = [12, 22, 41, 13] B = [1, 20, 10, 12] 出力: 12, 22, 41, 13 入力: A = [2, 5, 9, 7] B = [1, 12, 4, 54] 出力: 2 7 5 9 ※ 条件を満たす答えが複数存在する場合は、そのうちのどれか1つを出力すれば問題ありません。 この問題では、A[i] が B[i] を上回るインデ

  19. C++のSTLを活用して文字列のすべての順列を生成する方法

    はじめに文字列の順列(パーミュテーション)とは、与えられた文字列の文字をさまざまな順序に並べ替えてできる文字列のことです。このチュートリアルでは、C++の標準テンプレートライブラリ(STL)を使用して、指定された文字列のすべての順列を出力する方法を解説します。具体例入力 : s = ADT 出力 : ADT, ATD, DAT, DTA, TAD, TDA 説明 : 出力を見ると、すべての文字列が元の文字列に含まれる同じ3文字で構成され、単に並べ替えられているだけであることがわかります。したがって、これらは文字列の順列の定義に合致します。また重要な点として、これらは文字列sから作れるすべて

  20. C++で解く:n個からr個を選ぶ順列のうち、特定のk個が常に一緒になる場合の総数

    n、r、k が与えられたとき、n 個の物の中から r 個を選ぶ順列のうち、特定の k 個が常に一緒(隣接)して現れるような選び方が何通りあるかを求める問題を考えます。 入力 : n = 8, r = 5, k = 2 出力 : 960 入力 : n = 6, r = 2, k = 2 出力 : 2 この問題では「n 個から r 個を選ぶ順列」のうち「特定の k 個が必ずまとまって登場する」場合の数を求める必要があるため、組み合わせ論に関する基礎知識が少し必要になります。 解法のアプローチ まず、この問題に対する計算式を導き出すことが重要です。式さえ立てられれば、あとはそれをプログラム

Total 5990 -コンピューター  FirstPage PreviousPage NextPage LastPage CurrentPage:277/300  20-コンピューター/Page Goto:1 271 272 273 274 275 276 277 278 279 280 281 282 283