C++でk個のサブリストの最小最大合計を見つけるプログラム
numsと呼ばれる数値のリストと別の値kがあるとします。リストを空でないk個のサブリストに分割できます。 k個のサブリストの最小最大合計を見つける必要があります。
したがって、入力がnums =[2、4、3、5、12] k =2のような場合、リストを[2、4、3、5]と[のように分割できるため、出力は14になります。 12]。
これを解決するには、次の手順に従います-
-
関数ok()を定義します。これは、配列v、k、x、
を取ります。 -
cnt:=0、sum:=0
-
vの各要素iについて-
-
sum + i> xの場合、-
-
合計:=i
-
(cntを1増やします)
-
-
それ以外の場合
-
合計:=合計+ i
-
-
-
cnt <=kの場合はtrueを返し、それ以外の場合はfalse
を返します。 -
メインの方法から、次のようにします-
-
低:=0、ret:=0、高:=0
-
numsの各要素iについて
-
高:=高+ i
-
ret:=ret + i
-
low:=lowとiの最大値
-
-
低い<=高い間、実行-
-
中:=低+(高-低)/ 2
-
ok(nums、k --1、mid)が真の場合、-
-
ret:=mid
-
高:=中-1
-
-
それ以外の場合
-
低:=中+ 1
-
-
-
retを返す
例
理解を深めるために、次の実装を見てみましょう-
#include <bits/stdc++.h>
using namespace std;
bool ok(vector <int>& v, int k, int x){
int cnt = 0;
int sum = 0;
for(int i : v){
if(sum + i > x){
sum = i;
cnt++;
}
else{
sum += i;
}
}
return cnt <= k;
}
int solve(vector<int>& nums, int k) {
int low = 0;
int ret = 0;
int high = 0;
for(int i : nums){
high += i;
ret += i;
low = max(low, i);
}
while(low <= high){
int mid = low + ( high - low) / 2;
if(ok(nums, k - 1, mid)){
ret = mid;
high = mid - 1;
}
else{
low = mid + 1;
}
}
return ret;
}
int main(){
vector<int> v = {2, 4, 3, 5, 12};
int k = 2;
cout << solve(v, k);
} 入力
{2, 4, 3, 5, 12}, 2 出力
14
-
C++のツリーで最大のサブツリーの合計を検索します
この問題では、二分木が与えられます。私たちのタスクは、ツリー内で最大のサブツリーの合計を見つけることです。 問題の説明: 二分木は、正の値と負の値で構成されます。そして、ノードの合計が最大のサブツリーを見つける必要があります。 問題を理解するために例を見てみましょう。 出力: 13 説明: 左サブツリーの合計は7です 右サブツリーの合計は1です ツリーの合計は13です ソリューションアプローチ この問題を解決するために、ポストオーダートラバーサルを実行します。ノードの左側のサブツリーと右側のサブツリーの合計を計算します。現在のノードについて、現在のノードの
-
C++で最小の合計を持つツリーレベルを見つけるプログラム
二分木があり、そのルートのレベルが1、子のレベルが2などであると仮定します。レベルXのノードのすべての値の合計が最小になるように、最小のレベルXを見つける必要があります。したがって、ツリーが次のような場合- 合計が4– 10 =-6であるため、出力は2になります。これは最小です。 これを解決するには、次の手順に従います- level:=1、sum:=rの値、ansLevel:=level、ansSum:=sum キューqを定義し、指定されたノードrをqに挿入します qが空ではない間 容量:=qのサイズ レベルを1増やし、合計:=0 容量が0では