-
【C++】不等式 x*x + y*y < n を満たす異なる非負整数ペア(x, y)を数える方法
正の整数 N が与えられたとき、不等式 x2 + y2 < N を満たす「異なる非負整数のペア (x, y)」の個数を数えることを考えます。 x = 0 から x2 < N の範囲、y = 0 から y2 < N の範囲でそれぞれの値を順に試していき、x2 + y2 < N が成り立つ組み合わせが見つかるたびにペアのカウントを1つ増やします。 例で確認しよう 入力: n = 4出力: 異なるペア数 = 4説明: 条件を満たすペアは (0,0)、(1,1)、(0,1)、(1,0) の4つです。いずれも不等式 x2 + y2 < 4 を満たしています。 入力: n =
-
C++で文字列内の異なる部分文字列の個数を数える方法
本記事では、与えられた文字列 str に含まれる「異なる部分文字列」の総数を数える方法を解説します。部分文字列とは、既存の文字列から取り出せる文字列のことであり、その長さは元の文字列と同じか、それより短いものになります。 まず、具体例を使って問題とその解き方を確認してみましょう。 入力: str = wxyz 出力: 異なる部分文字列の数は 10 説明: 数え上げられる異なる部分文字列は以下の通りです。 wxyz, wxy, wx, w, xyz, xy, x, yz, y, z の10個 入力: str = zzzz 出力: 異なる部分文字列の数は 4 説明: 異なる部分文字列は以下の通り
-
C++でセットに追加できる差分要素の最大数を求める方法
問題概要要素数 n の整数集合 arr[n] が与えられたとき、そのセットに追加できる「差分要素」の最大数を求めるのが課題です。ここでの差分とは |a−b| の形で表される値を指し、a と b はどちらも集合に含まれる要素です。つまり、集合の中から生じる差分のうち、重複せず最大となるものの総数を数えます。具体例を見ながら、問題と解き方を理解していきましょう。入力例と出力例入力 − set = {1, 5}出力 − セットに追加できる差分要素の最大数: 1説明 − 集合内に存在する差分は |1−5| = 4 の1つだけです。入力 − set = {2, 7, 1, 9}出力 − セットに追加でき
-
C++で最大M個の商品を販売して利益を最大化するアルゴリズム
この記事では、最大「M」個の商品を販売したときに得られる利益の最大値を求める問題について解説します。商品の総数は「N」個で、各商品の仕入れ値(原価)と販売価格は、それぞれリスト CP[] と SP[] に格納されています。入力例と出力例例1N=6, M=4 CP[]={1,9,5,8,2,11} SP[]={1,15,10,16,5,20}出力:28説明: 各商品を販売したときに得られる利益は、順に 0、6、5、8、3、9 となります。4つの商品だけを販売して利益を最大化するには、最も利益の高い商品、すなわち2番目・3番目・4番目・6番目の商品を選ぶ必要があります。最大利益 = 6 + 5 +
-
C++で数字の連続区間を代替数字に置き換えて数値を最大化する方法
N桁の数値を最大化する問題を考えます。置き換えには、0から9までの各1桁の数字に対応する代替数字を10個格納した配列を使用します。ただし、置き換えが可能なのは連続した一つの区間のみで、かつ一度だけという条件が課せられています。入出力例例1入力:N=1234, arr[]={3 ,0 ,1 ,5 ,7 ,7 ,8 ,2 ,9 ,4}出力:1257説明:3は代替数字5(arr[3])に置き換えられます。4は代替数字7(arr[4])に置き換えられます。これにより「1234」が「1257」へと最大化されます。例2入力:N=5183, arr[]={3 ,0 ,1 ,5 ,7 ,7 ,8 ,2 ,9
-
【C++】数値Nの4つの因数の積を最大化する方法
この記事では、与えられた整数 N に対して、4つの因数 A・B・C・D の積が最大となる組み合わせを求める問題を解説します。ただし、次の条件を満たす必要があります。4つの因数の合計が N と等しいこと、すなわち N = A + B + C + D であること。具体例例1入力: N = 10出力: 20説明: 10の因数は 1, 2, 5, 10 です。5 × 2 × 2 × 1 = 20 のとき積が最大となり、条件 5 + 2 + 2 + 1 = 10 も同時に満たしています。例2入力: N = 16出力: 256説明: 16の因数は 1, 2, 4, 8, 16 です。4 × 4 × 4 ×
-
C++でKで割り切れる合計ペアの最大数を求める方法
N個の整数を含む配列 arr[] が与えられたとき、Kで割り切れる arr[i] + arr[j] のペアの最大数を求めることを考えます。ただし、同じインデックスを複数のペアに使用することはできないという条件が付きます。 入力 arr[]={1, 2, 5, 8, 3}, K=2 出力 2 説明 条件を満たすのは (0,2) と (1,3) のペアです。1+5=6、2+8=10 となり、いずれも2で割り切れます。 ほかに (0,4) と (1,3)、あるいは (2,4) と (1,3) という選び方も考えられますが、答えは同じく2になります。 入力 arr[]={1, 3, 5, 2, 3,
-
【C++】K個の連続する部分配列の最小値の中で最大値を最大化する方法
問題概要 配列 arr[] を K 個の連続する部分配列に分割し、それぞれの部分配列における最小値の中から最も大きい値を求めます。このとき、その最大値が取り得る値を最大化することが本問題の目的です。 入力 arr[] = {2,8,4,3,9,1,5}, K=3 出力 9 説明 − 作成できる3つの連続する部分配列は {2, 8, 4, 3}、{9}、{1, 5} です。 これらの配列の最小値はそれぞれ (2, 9, 1) となります。 この3つの値の中で最大なのは 9 です。 入力 arr[] = {8, 4, 1, 9, 11}, K=1 出力 11 プログラムで使用するアプローチ この
-
C++:行列内のA[i][j]=0となるインデックス(i, j)の最大差を求める方法
本記事では、n×nのサイズを持つ行列が与えられたとき、a[i][j] = 0となる要素のインデックス(i, j)の差の最大値を求める方法を解説します。この問題では、行列内に少なくとも1つの0が存在することが前提となります。例で理解しよう入力例1int matrix[][] = { {0, 1, 1}, {0, 0, 0}, {4, 5, 1}}出力A[i][j] = 0となるインデックス(i, j)の最大差:1説明この行列では、matrix[0][0]、matrix[1][0]、matrix[1][1]、matrix
-
C++で2つの配列からX個とY個の要素を選び、合計を最大化する方法
サイズNの2つの配列が与えられたとき、1つ目の配列からX個、2つ目の配列からY個の要素を選択して、その合計を最大化することが課題です。具体的な例を使って、何をすべきか見ていきましょう。入力例1arr1 = {1,2,3,4,5} ; X=2 arr2 = {1,3,5,2,7}; Y=3出力例1最大合計値 : 24解説: arr1から2つ、arr2から3つの数値を選びます。arr1の大きい方から2つは「4, 5」、arr2の大きい方から3つは「3, 5, 7」です。これら5つの要素の合計は24となり、これが条件を満たす最大値になります。入力例2arr1 = {10,13,16,14}; X=1
-
C++でAの一部の桁をBの数字に置き換えてAの値を最大化する方法
この記事では、別の数Bに含まれる数字を使って数Aの一部の桁を置き換え、Aの値を最大化する問題をC++で解く方法を解説します。ただし、Aの値を最大化できない場合は、どの桁も置き換えません。注意: Bの各数字は一度しか使用できません。問題の理解まず、具体例を使って問題内容を確認しましょう。例1A = 1221 B = 1211出力:Aの最大値:2221解説: この例では、Bから「2」を選び、Aの先頭の「1」と置き換えます。Aの他の桁を「2」や「1」で置き換えても値が増加しないため、これが唯一の選択肢となります。例2A = 1002 B = 3200出力:Aの最大値:3202アルゴリズムのアプローチ
-
C++で与えられた辺の合計から直方体の体積を最大化する方法
この記事では、直方体の3辺(長さ・幅・高さ)の合計が与えられたとき、その体積を最大化する方法を解説します。直方体の体積は3辺の積として計算され、各辺をできるだけ均等に近づけることで最大値が得られます。 直方体の体積とは 直方体には「長さ」「幅」「高さ」の3つの辺があります。体積は次の式で求められます。 直方体の体積 = 長さ × 幅 × 高さ 体積を最大化するためには、3つの辺を互いにできるだけ近い値にすることがポイントです。これは相加平均・相乗平均の関係からも、和が一定のとき3数が等しい場合に積が最大になることが知られています。 問題の具体例 辺の合計Sが与えられ、各辺をL、B、Hとしま
-
C++でN個のコンテナからXを引き当てる確率を最大化する方法
確率は一般に次の式で表されます。Pi =(有利な結果の数)/(結果の総数)ここで、コンテナの個数を表す整数 N が与えられ、2つの数値 X と Y のコピーがそれぞれ N 個ずつあるとします。この課題では、X のコピーを N 個のコンテナへ振り分けることで、「X を引き当てる確率」を最大にすることを目指します。上記の定義から、Pi を最大化するには分子(有利な結果の数)を大きくするか、分母(結果の総数)を小さくすればよいことがわかります。最適な戦略は、Y のコピーを1つのコンテナに集中させ、それ以外のすべてのコンテナには X のみを入れることです。具体的には次のように配置します。N-1 個のコ
-
C++でソート後の配列における隣接要素の最大差を求める方法
問題の概要整数型の配列が与えられます。この配列は必ずしもソートされているとは限りません。求めたいのは、ソート後の配列において隣接する要素同士の差の最大値です。解決の手順はシンプルです。まず配列を昇順(または降順)にソートし、その後、配列を先頭から走査しながら隣接要素間の差 Arr[i+1] - Arr[i] を計算します。各ステップで、その差がこれまでに見つかった最大値より大きければ、最大値を更新していきます。入出力例例1入力: Arr[] = [1, 5, 10, 2, 7]出力: ソート後の配列における隣接要素の最大差は 3解説: 昇順にソートすると Arr[] = [1, 2, 5, 7
-
【C++】連結リスト内で指定した数Kで割り切れる最大要素と最小要素を求める方法
連結リストとは 連結リスト(リンクリスト)は、要素同士がポインタで連結された線形データ構造です。各要素(ノード)は「データ部分」と「次の要素を指すリンク(ポインタ)」を持ち、メモリ上の連続していない場所に配置されることもあります。 本記事では、データ部分と次ノードへのリンクを持つ片方向連結リストと、整数Kが与えられます。目的は、連結リスト内の要素のうち「Kで割り切れる」要素の最大値と最小値を見つけることです。線形連結リストは一方向にしか走査できないため、ヘッド(先頭)ノードから順に各ノードを訪問し、そのデータ部分がKで割り切れるかどうかを判定します。現在のノードの値が、それまでに見つかった最
-
C++で配列から4つの辺を選んで長方形の最大面積を求める方法
長方形の面積の基本長方形の面積は、隣り合う2つの辺の長さを掛け合わせることで求められます。すべての長方形は4つの辺を持ち、向かい合う辺はそれぞれ同じ長さになります。面積を計算するには、「縦(長さ)」と「横(幅)」という2種類の辺の値が必要です。式で表すと次のようになります。長方形の面積 = 縦 × 横本記事では、長方形の辺となりうる値がランダムな順序で格納された整数型配列が与えられます。配列には4辺分の値がすべて含まれていますが、順序はバラバラです。ここでの課題は、配列の中から面積が最大化するように2組のペア(合計4つの辺)を選び出すことです。入力例1Arr[] = { 1,2,1,3,4,4
-
C++で複素数の平方根を求めるsqrt()関数の使い方
C++では、複素数の平方根を簡単に計算できます。その鍵となるのがsqrt()関数です。この関数は標準ライブラリの<complex>ヘッダーファイルに定義されており、複素数を引数として受け取り、その平方根を別の複素数として返します。本記事では、sqrt()関数の構文、パラメータ、戻り値、そして実際のコード例を通じて、その使い方を詳しく解説します。構文template<class T> complex<T> sqrt(const complex<T>& x);パラメータx − 平方根を求めたい対象の複素数を表すパラメータです。戻り値この関数は
-
C++で文を単語ごとに分割する方法
今回は、与えられた文を単語ごとに分割する方法を解説します。文中に含まれるすべての単語を取り出し、1行に1単語ずつ出力していきます。入力例と出力例入力I am a good boy出力I am a good boyこのように、元の文に含まれる各単語を1行ずつ出力するのが目標です。サンプルコード1#include <iostream> #include <string> using namespace std; void split(string st){ string word = ; for (char s : st){ if (s =
-
C++のiswprint()関数とは?ワイド文字が印刷可能か判定する方法
C++ STLに用意されているiswprint()関数は、指定されたワイド文字(wide character)が印刷可能かどうかを判定するための関数です。この関数はヘッダーファイル<cwctype>で定義されています。ワイド文字とは、従来の8ビット文字よりも大きなサイズを持つコンピュータ上の文字データ型のことで、主にマルチバイト文字やUnicode文字を扱う際に使用されます。 構文 int iswprint(c); パラメータ c ― 印刷可能かどうかを判定したいワイド文字を指定します。 戻り値 cが印刷可能な場合は0以外の値を返し、印刷できない場合は0を返します。 印刷可能とみな
-
【C++ STL】map::operator[](添字演算子)の使い方とサンプルコード徹底解説
この記事では、C++ STLのmap(マップ)コンテナで使われる添字演算子「[]」、すなわちmap::operator[]について、その仕組み・構文・具体的な使用例をわかりやすく解説します。C++ STLにおけるmapとは?mapは連想コンテナの一種で、「キー値」とそれに対応する「マップ値」の組み合わせからなる要素を、特定の順序で格納できるコンテナです。mapコンテナ内部のデータは、常に関連付けられたキーに基づいて自動的にソートされます。また、各要素には一意なキーが割り当てられており、このキーを通じて値へアクセスします。map::operator[]([]演算子)とは?map::operato