C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C ++で許可されている特定の配列での回転のみでSum(i * arr [i])の最大値を検索します


この問題では、n個の要素で構成される配列arr[]が与えられます。特定の配列での回転のみが許可されているSum(i * arr [i])の最大値を見つける必要があります。 (i * arr [i])の最大合計を見つけるために、任意の数の回転を実行できます。

問題を理解するために例を見てみましょう

入力

arr[] = {4, 1, 3, 7, 2}

出力

43

説明

配列を1回回転させて最大値を取得します。回転後、配列は{2、4、1、3、7}

になります。

合計=0* 2 + 1 * 4 + 2 * 1 + 3 * 3 + 4 * 7 =0 + 4 + 2 + 9 + 28 =43

ソリューションアプローチ

この問題の簡単な解決策は、アレイをn回回転させることです。各回転の後、sum(i * arr [i])を見つけて、すべての値の最大値を返します。これは素晴らしいことですが、時間計算量はO(n2)のオーダーです。この問題のより効率的な解決策は、数式を使用して回転せずにsum(i * arr [i])の値を見つけることです。

数式を数学的に導きましょう

Let the sum after k rotation is equal to sum(k).
sum(0) = 0*arr[0] + 1*arr[1] +...+ (n-1)*arr[n-1] => eq 1

次に、値をローテーションします。その後、合計は次のようになります。

sum(1) = 0*arr[n-1] + 1*arr[0] +...+ (n-1)*arr[n-2] => eq 2 Subtracting eq2 - eq 1
sum(1) - sum(0) = 0*arr[n-1] + 1*arr[0] +...+ (n-1)*arr[n-2] - 0*arr[0] + 1*arr[1] +...+ (n-1)*arr[n-1]
sum(1) - sum(0) = arr[0] + arr[1] + … arr[n-2 ] - (n - 1)*arr[n-1]

同様に、sum(2)-sum(1)、

sum(2) - sum(1) = arr[0] + arr[1] + …. arr[n - 3] - (n - 1)*arr[n-2] + arr[n-1]

方程式を一般化する、

sum(k) - sum(k-1) = arr[0] + arr[1] + …. Arr[n - 1] - (n)*arr[n - k]

これを使用して、sum(0)を使用してsum(k)の値を見つけることができます

ここで、ソリューションでは、配列のすべての値の合計を見つけてから、sum(0)の値を見つけます。ループを使用して、1からnまでのsum(k)のすべての値を見つけます。そして、それらの最大値を返します。

ソリューションの動作を説明するプログラム

#include <iostream>
using namespace std;
int findMaxSumRotation(int arr[], int n){
   int arrSum = 0;
   int currSum = 0;
   for (int i=0; i<n; i++){
      arrSum = arrSum + arr[i];
      currSum = currSum+(i*arr[i]);
   }
   int maxSum = currSum;
   for (int j=1; j<n; j++){
      currSum = currSum + arrSum-n*arr[n-j];
      if (currSum > maxSum)
         maxSum = currSum;
   }
   return maxSum;
}
int main(){
   int arr[] = {4, 1, 3, 7, 2};
   int n = sizeof(arr)/sizeof(arr[0]);
   cout<<"The maximum value of sum(i*arr[i]) using rotations is "<<findMaxSumRotation(arr, n);
   return 0;
}

出力

The maximum value of sum(i*arr[i]) using rotations is 43

  1. C++で指定された操作で配列の合計を最大化する

    説明 (2 * n – 1)個の整数の配列があります。配列内の正確にn個の要素の符号を変更できます。つまり、正確にn個の配列要素を選択し、それぞれに-1を掛けることができます。配列の最大合計を求めます。 例 入力配列が{-2、100、-3}の場合、-2と-3の最大変化符号を取得できます。符号配列を変更すると、-になります {2、100、3}であり、この配列の最大合計は105です。 アルゴリズム 負の数を数える 数値の絶対値を使用して、配列の合計を計算します。 数値の絶対値を取得して、配列の最小数を見つけます いいえかどうかを確認します。負の数の数は奇数であり、nの値は偶数であり、合計か

  2. C++の配列で最大GCDのペアを検索します

    正の整数の配列があるとします。私たちのタスクは、GCD値が最大である配列から整数のペアを見つけることです。 A ={1、2、3、4、5}とすると、出力は2になります。ペア(2、4)にはGCD 2があり、他のGCD値は2未満です。 この問題を解決するために、各要素の除数の数を格納するためのカウント配列を維持します。除数を数えるプロセスには、O(sqrt(arr [i]))の時間がかかります。全体をトラバースした後、最後のインデックスから最初のインデックスまでカウント配列をトラバースできます。要素が1より大きい値が見つかった場合、これは2つの要素の約数であり、最大GCDでもあることを意味します。