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では