C++で数値にk個の区切り点を設定した後の最大セグメント値を求める方法
この問題では、大きな数値を表す文字列と、区切り点(ブレークポイント)の数を表す整数kが与えられます。私たちのタスクは、数値にk個の区切り点を設定した後に得られる最大のセグメント値を見つけるプログラムを作成することです。
つまり、文字列として与えられた数値の中にk個の区切り点を挿入することで生成できる、最大の数値を求める必要があります。
問題の理解
具体例を使って問題を確認しましょう。
入力: 文字列 = "45972"、k = 3
出力: 97
説明:
考えられるすべての分割パターンは以下の通りです。 45 9 7 2 4 59 7 2 4 5 97 2 4 5 9 72 この中で最大の数値は97です。
解決アプローチ:スライディングウィンドウ法
この問題を解くには、スライディングウィンドウ(sliding window)という手法が有効です。ここでのポイントは以下の通りです。
- ウィンドウサイズは「文字列の長さ − k」となります。これは、k個の区切り点を挿入したときに生成される最大セグメントの桁数に相当します。
- 指定されたサイズを持つすべての候補数値に対して、スライディングウィンドウ技法を用いて最大値を効率的に探索します。
- 各ステップで先頭の桁を削除し、末尾に新しい桁を追加するだけで値を更新できるため、毎回数値を最初から計算するよりも高速に処理できます。
C++による実装例
以下は、数値にk個の区切り点を設定した後の最大セグメント値を求めるC++プログラムです。
#include <bits/stdc++.h>
using namespace std;
int findMaxSegmentWithKbreaks(string &s, int k) {
int window = s.length() - k;
int MaxNumber = 0;
for (int i=0; i<window; i++)
MaxNumber = MaxNumber * 10 + (s[i] - '0');
int slWindow = pow(10, window-1);
int value = MaxNumber;
for (int i = 1; i <= (s.length() - window); i++) {
value = value - (s[i-1]- '0')*slWindow;
value = value*10 + (s[i+window-1]- '0');
MaxNumber = max(MaxNumber, value);
}
return MaxNumber;
}
int main() {
string s = "45972";
int k = 3;
cout<<"Maximum segment value after putting "<<k<<" break points in a number = "<<findMaxSegmentWithKbreaks(s, k);
return 0;
}実行結果
Maximum segment value after putting 3 breakpoints in a number = 97
コードの解説
このプログラムの動作を順番に見ていきましょう。
- まず、ウィンドウサイズを「文字列の長さ − 区切り点の数」で計算します。例では 5 − 3 = 2 桁となります。
- 最初のウィンドウ(先頭からwindow桁分)の数値を構築し、初期の最大値として保存します。
- その後、ウィンドウを1桁ずつ右にスライドさせます。具体的には、左端の桁の値を減算し、残りの値を10倍してから新しい右端の桁を加算します。
- 各ステップで現在の値と最大値を比較し、より大きい方を最大値として更新します。
この手法により、時間計算量はO(n)となり、すべての分割パターンを総当たりで確認する方法と比べて大幅に効率的です。大きな数値を扱う場合でも、文字列ベースで処理するためオーバーフローの心配もありません。
-
二分木で屈曲数が最大となるパスの長さを求めるC++プログラム
本記事では、二分木が与えられたときに、屈曲数が最大となるパスを求める問題を解いていきます。ここで「屈曲(ベンド)」とは、パスの進行方向が左から右へ、または右から左へと切り替わる箇所のことです。具体例を見てみましょう。入力 −出力 −6この方法では、木を走査しながら直前の移動方向を記録していきます。方向が変化した時点で屈曲数を加算し、最終的にその最大値を求めます。解法のアプローチこのアプローチでは、すべてのパスを辿り、各パスにおける屈曲の総数を計算します。葉ノードに到達した時点で、これまでの屈曲数が現在の最大値を上回っていれば、答えとパスの長さを新しい値に更新します。C++による実装例#incl
-
C++でN個のセグメントを使って7セグメントディスプレイに表示できる最大の数を求める方法
問題の概要 この記事では、7セグメントディスプレイに対してN個のセグメントを使用したときに、表示できる最大の数を求める方法を解説します。 まず、具体例を使って何をすべきかを確認しましょう。 入力 − N=5 出力 − 71 説明 − この場合、最大の数は7セグメントディスプレイ上で次のように表示されます。 入力 − N=6 出力 − 111 アルゴリズムのアプローチ この問題は、次の3つの場合に分けて考えることができます。 ケース1 −Nが0または1の場合、どの数字も表示できません。 ケース2 −Nが奇数の場合です。奇数個のセグメントで表示できる数字は2、3、5、7、8であり、その中で最