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

配列を再配置して、C++の連続するペア要素の積の合計を最小化します


正の整数型の配列、たとえば、任意のサイズのarr[]が与えられます。タスクは、要素に代替要素を乗算し、結果のすべての要素を加算すると、最小の合計が返されるように配列を再配置することです。

このためのさまざまな入出力シナリオを見てみましょう-

入力 − int arr [] ={2、5、1、7、5、0、1、0}

出力 −合計を最小化するための配列の再配置、つまり、連続するペア要素の積の7は次のとおりです。70 5 0 5 1 2 1

説明 −サイズ8の整数配列が与えられます。次に、配列を再配置します。つまり、7 0 5 0 5 1 2 1.戻り値の最小合計、つまり7 * 0 + 5 * 0 + 5 * 1+2かどうかを確認します。 * 1 =0 + 0 + 5 +2=7。

入力 − int arr [] ={1、3、7、2、4、3}

出力 −合計を最小化するための配列の再配置、つまり、連続するペア要素の積の24は次のとおりです。71 4 2 3 3

説明 −サイズ6の整数配列が与えられます。次に、配列を再配置します。つまり、7 1 4 2 3 3.戻りの最小合計、つまり7 * 1 + 4 * 2 + 3 * 3 =7+8かどうかを確認します。 + 9=24。

以下のプログラムで使用されているアプローチは次のとおりです

  • 整数型要素の配列を入力し、配列のサイズを計算します。

  • 配列と配列のサイズをsort関数に渡すことにより、C++STLのsortメソッドを使用して配列をソートします。

  • 整数変数を宣言し、functionRearrange_min_sum(arr、size)

    を呼び出して設定します。
  • 関数Rearrange_min_sum(arr、size)

    の内部
    • 変数を作成します。たとえば、整数変数を格納する「偶数」および「奇数」タイプの型ベクトルを作成します。

    • 変数をtempおよびtotalとして宣言し、0で初期化します。

    • iがサイズより小さくなるまでiから0までループFORを開始します。ループ内で、iがサイズ/2未満であるかどうかを確認してからarr[i]を奇数ベクトルELSEにプッシュし、arr[i]を偶数ベクトルにプッシュします

    • even.begin()、even.end()、greater ()。

      を渡して、sortメソッドを呼び出します。
    • iがeven.size()未満になるまで、ループFORをiから0まで開始します。ループ内で、arr [temp++]をeven[j]に、arr [temp++]をodd[j]に、totalをtotal +even [j] * odd [j]

      に設定します。
    • 合計を返す

  • 結果を印刷します。

#include <bits/stdc++.h>
using namespace std;
int Rearrange_min_sum(int arr[], int size){
   vector<int> even, odd;
   int temp = 0;
   int total = 0;
   for(int i = 0; i < size; i++){
      if (i < size/2){
         odd.push_back(arr[i]);
      }
      else{
         even.push_back(arr[i]);
      }
   }
   sort(even.begin(), even.end(), greater<int>());
   for(int j = 0; j < even.size(); j++){
      arr[temp++] = even[j];
      arr[temp++] = odd[j];
      total += even[j] * odd[j];
   }
   return total;
}
int main(){
   int arr[] = { 2, 5, 1, 7, 5, 0, 1, 0};
   int size = sizeof(arr)/sizeof(arr[0]);
   //sort an array
   sort(arr, arr + size);
   //call function
   int total = Rearrange_min_sum(arr, size);
   cout<<"Rearrangement of an array to minimize sum i.e. "<<total<<" of product of consecutive pair elements is: ";
   for(int i = 0; i < size; i++){
      cout << arr[i] << " ";
   }
   return 0;
}

出力

上記のコードを実行すると、次の出力が生成されます

Rearrangement of an array to minimize sum i.e. 7 of product of consecutive pair elements is: 7 0 5 0 5 1 2 1

  1. C++での配列要素の頻度のカウント

    重複する値を含む整数要素の配列が与えられます。タスクは、配列に存在する個別の要素の頻度を計算し、結果を出力することです。 入力 − int arr [] ={1、1、2、3、4、1、2、3} 出力 − frequency of 1 is: 3 frequency of 2 is: 2 frequency of 3 is: 2 Frequency of 4 is: 1 入力 − int arr [] ={2、3、4、1、5} 出力 − frequency of 1 is: 1 frequency of 2 is: 1 frequency of 3 is: 1 Frequency

  2. C++の配列内のすべての素数の積

    いくつかの要素を持つ整数配列arr[]が与えられた場合、タスクはその数のすべての素数の積を見つけることです。 素数は、1で割った数、またはその数自体です。または、素数は、1とその数自体を除いて他の数で割り切れない数です。 1、2、3、5、7、11など 与えられた配列の解を見つける必要があります- 入力 −arr [] ={11、20、31、4、5、6、70} 出力 − 1705 説明 −配列の素数は− 11、31、5であり、それらの積は1705 入力 − arr [] ={1、2、3、4、5、6、7} 出力 − 210 説明 −配列の素数は− 1、2、3、5、7