C++でターゲットに最も近い変異配列の合計
整数配列arrとターゲット値targetがあるとすると、指定された配列のvalueより大きいすべての整数を変更すると、配列の合計が次のように等しくなるような整数値を見つける必要があります。ターゲットにすることが可能です。それらが同じである場合は、そのような最小の整数を返します。したがって、配列が[4,9,3]のようで、ターゲットが10の場合、出力は3を使用すると3になり、配列は[3,3,3]になるため、合計は9になります。これは最も近い要素です。 10まで。
これを解決するには、次の手順に従います-
- n:=配列のサイズ、avg:=total / n、set sum:=0およびcnt:=0
- 0からn–1の範囲のiの場合
- arr [i] <=avgの場合、sum:=sum + arr [i]、cntを1増やします
- target – sum =0の場合、平均を返します
- 高:=(ターゲット-合計)/(n-cnt)の上限
- 低:=(ターゲット-合計)/(n-cnt)のフロア
- lowDiff:=| target –(low *(n --cnt)+ sum)|
- highDiff:=| target –(high *(n --cnt)+ sum)|
- lowDiff <=highDiffの場合、lowを返します
- ハイに戻ります。
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std; class Solution { public: int findBestValue(vector<int>& arr, int target) { int n = arr.size(); int avg = target / n; int sum = 0; int cnt = 0; for(int i = 0; i < n; i++){ if(arr[i] <= avg){ sum += arr[i]; cnt++; } } if(target - sum == 0)return avg; int high = ceil(((target - sum) * 1.0)/ ((n - cnt) * 1.0)); int low = floor(((target - sum) * 1.0) / ((n - cnt) * 1.0)); int lowDiff = abs(target - (low * (n - cnt) + sum)); int highDiff = abs(target - (high * (n - cnt) + sum)); if( lowDiff <= highDiff)return low; return high; } }; main(){ vector<int> v = {4,9,3,2}; Solution ob; cout << (ob.findBestValue(v, 10)); }
入力
[4,9,3,2] 10
出力
3
-
C ++の合計配列パズル?
ここでは、配列に関連する1つの興味深い問題を確認します。 n個の要素を持つ配列があります。 n個の要素の別の配列を作成する必要があります。ただし、2番目の配列のi番目の位置は、i番目の要素を除く最初の配列のすべての要素の合計を保持します。そして、1つの制約は、この問題では減算演算子を使用できないことです。 減算演算を使用できれば、すべての要素の合計を取得し、最初の配列のi番目の要素を減算して、2番目の配列のi番目の場所に格納することで、この問題を簡単に解決できます。 ここでは、毎回要素を追加することでこれを解決し、0..n-1のiについては、位置iの要素を無視します。ポイントを得るためのア
-
C++でポインタ演算を使用した配列の合計
これは、ポインタを使用して配列要素の合計を見つけるC++プログラムです。 アルゴリズム Begin Initialize the array elements with values from user input. Initialize s = 0 Loop for i = 0 to s = s + *(ptr + i) Print the sum value in variable s. End サンプルコード #include<iostr