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

C++で指定された配列をk回繰り返すことによって形成された配列の最大サブ配列合計


この問題では、配列と数kが与えられます。私たちのタスクは、c++で指定された配列をk回繰り返すことによって形成された配列の最大サブ配列合計を見つけるプログラムを作成することです。

問題の説明 −ここでは、指定された配列をk回繰り返して形成された配列から形成されたサブ配列の最大合計を求めます。

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

入力 −配列={3、5、1} k =2

出力 − 18

説明

array formed by repeating k times,
array = {3, 5, 1, 3, 5, 1}
Maximum subarray sum = 3+5+1+3+5+1 = 18

この問題を解決するために、配列のすべての要素の合計を計算します。

次に、合計に基づいて、サブアレイの合計計算を計算します。

合計が0より大きい場合、実際の合計を与えた配列の合計をk倍します。

sum <0の場合、maxSumが2回の配列の繰り返しを行うサブ配列が見つかります。

ソリューションの実装を示すプログラム

#include<iostream>
using namespace std;
void repeatArray(int *arr, int *b, int k,int len) {
   int j = 0;
   while (k > 0){
      for (int i = 0; i < len; i++)
      b[j++] = arr[i];
      k--;
   }
}
long subArraySum(int *a,int len) {
   int max = 0;
   long newmax = 0;
   for (int i = 0; i < len; i++) {
      newmax = newmax + a[i];
   if (max < newmax)
      max = newmax;
   if (newmax < 0)
      newmax = 0;
   }
   return max;
}
long findMaxSubArraySum(int *arr, int k,int len) {
   int arraySum = 0;
   long maxSum = 0;
   int b[(2 * len)]= {0};
   repeatArray(arr, b, 2,len);
   for (int i = 0; i < len; i++)
   arraySum += arr[i];
   maxSum = subArraySum(b,2*len);
   if (arraySum > 0)
      maxSum = subArraySum(b,2*len) + (k - 2) * arraySum;
   return maxSum;
}
int main() {
   int arr[] = { 3, 5, 1};
   int length=sizeof(arr)/sizeof(arr[0]);
   int k = 3;
   cout<<"The maximum subarray sum in array formed by repeating the given array "<<k<<" times is "<<findMaxSubArraySum(arr, k,length);
   return 0;
}

出力

The maximum subarray sum in array formed by repeating the given array 3 times is 27

  1. C++の配列の最大平衡合計

    問題の説明 配列arr[]が与えられます。 arr[]のインデックスiのサフィックス合計でもあるプレフィックス合計の最大値を見つけます。 例 入力配列が-の場合 Arr [] ={1、2、3、5、3、2、1}の場合、出力は次のように11になります- プレフィックス合計=arr[0..3] =1 + 2 + 3 + 5=11および サフィックスの合計=arr[3..6] =5 + 3 + 2 + 1 =11 アルゴリズム 配列をトラバースし、各インデックスのプレフィックスの合計を配列presum []に格納します。ここで、presum[i]はサブ配列arr[0..i]の合計を格納し

  2. C++で指定されたオブジェクトの配列から最大の高さのピラミッドを見つけます

    n個のオブジェクトの配列があるとします。各オブジェクトの幅はW[i]です。 -のようにピラミッド状に配置する必要があります i番目の全幅が(i + 1)番目未満 i番目のオブジェクトの総数が(i + 1)番目未満です たとえば、重みが[40、100、20、30]の場合、出力は2になります。したがって、最上位レベルは30、次に下位レベル20、40、100 これを解決するために、欲張りアプローチを使用します。アイデアは、幅の狭いオブジェクトを上部に配置し、次のオブジェクトを真下のレベルに配置するというように使用することです。レベルの最大数を取得するには、指定された配列を並べ替