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

k要素のグループとCの配列の残りの部分との最大差


サイズNと数値kの整数の配列が与えられます。配列はランダムな順序の整数で構成されます。タスクは、k要素のグループと配列の残りの部分との間の最大の差を見つけることです。アレイは2つの部分に分割されます。最初の部分は取り出されたk要素のグループであり、2番目の部分は配列の残りの要素です。両方のグループの要素の合計の差が最大になるように、k個の要素を選択する必要があります。

kが小さい場合(<=配列サイズの半分)、最小のk要素の合計は最小になり、残りのN-k要素の合計は最大になります。したがって、最大の差は-(残りのN-k要素の合計)-(最小のk要素の合計)です。

kが大きい場合(配列サイズの半分以上)、最大のk要素の合計が最大になり、残りのN-k要素の合計が最小になります。したがって、最大の差は(最大のk要素の合計)-(残りのN-k要素の合計)です。

入力

Arr[] = { 2,5,6,1,3,2,1,4 }. k=3

出力 − k要素のグループと配列の残りの部分との最大差− 16

説明 −ここで、kは小さいので、最小の3つの数値の合計が最小になります。

最小3つの数値− 1,1,2 sum =4

残りのN-k=5つの数値:2、3、4、5、6合計=20

最大差:20-4 =16

入力

Arr[] = { 2,2,3,4,8,3,4,4,8,7 }. k=6

出力 − k要素のグループと配列の残りの部分との最大差− 25

説明 −ここで、kは大きいので、最大の6つの数値が最大の合計になります。

最高の6つの数字− 8,8,7,4,4,4、sum =35

残りのN-k=4つの数値− 2,2,3,3 sum =10

最大差-35-10=

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

  • ランダムな順序で含まれる整数の配列を宣言します。(Arr [])

  • 配列のサイズを格納する変数を作成します。 (N)

  • 関数maxKDiff(int Arr []、int n、int k)は、配列内の要素の最初と最後のインデックス間の最大差(maxD)を計算するために使用されます。

  • 配列全体の合計を計算し、arrsumに格納します。

  • まず、最小k個の要素の合計を計算します。 forループの使用(i =0; i

    kが小さい場合、最小のk要素の合計は最小になります-

  • D1にabs((配列全体の合計)-(2 *最小k要素の合計))を格納します。配列の合計にもこれらの要素があるため、2回です。

    kは、最大のk要素の合計が最大になるよりも大きくなります-

  • D2にabs((配列全体の合計)-(2 *最高のk要素の合計))を格納します。配列の合計にもこれらの要素があるため、2回です。

  • D1とD2を比較し、最大値をmaxDに保存します。

  • 結果としてmaxDを返します。

#include <stdio.h>
#include <math.h>
// function for finding maximum group difference of array
int maxKDiff (int arr[], int n, int k){
   // sum of array
   int arrsum = 0;
   int i;
   for(i=0;i<n;i++)
      arrsum+=arr[i];
   //sum of smallest k
   int sumk=0;
   for(i=0;i<k;i++)
      sumk+=arr[i];
   // difference for k-smallest
   int D1 = abs(arrsum - 2*sumk);
   //sum of largest k elements
   sumk=0;
   int j=0;
   for(i=n-1;j<4;i--){
      sumk+=arr[i]; j++;
   }
   // difference for k-largest
   int D2 = abs(arrsum - 2*sumk);
   int maxD=D1>=D2?D1:D2;
   // return maximum difference value
   return maxD;
}
// driver program
int main(){
   int arr[] ={ 2,3,2,10,7,12,8};
   int n = 7;
   int k = 3;
   sort(arr,n); // to sort array in ascending order
   printf("Maximum difference between the group of k-elements and rest of the array : %d" , maxKDiff(arr,n,k));
   return 0;
}

出力

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

Maximum difference between the group of k-elements and rest of the array : 30

  1. Javascriptのrestパラメーターとargumentsオブジェクトの違いは何ですか?

    残りのパラメーター restパラメーターを使用すると、いくつかの引数を配列として表すことができます。 ES6は、開発者の作業を容易にするためにRESTパラメーターをもたらしました。引数オブジェクトの場合、RESTパラメーターは3つのドットで示され、パラメーターの前にあります。 引数オブジェクト JavaScriptのArgumentsオブジェクトは、実行中の関数への引数を表すオブジェクトです。 残りのパラメータと引数オブジェクトの違いは次のとおりです。 Argumentsオブジェクトには、関数に渡されるすべての引数が含まれますが、RESTパラメーターは別の名前が付けられていないパラメー

  2. JavaScript関数のデフォルトパラメーターとRESTパラメーターの違いは何ですか?

    デフォルトのパラメータ デフォルトのパラメータは関数パラメータを簡単に処理するようになりました。デフォルトパラメータを簡単に設定して、デフォルト値で正式なパラメータを初期化できます。これは、値または未定義が渡されない場合にのみ可能です。 例 <html>    <body>       <script>          // default is set to 1          function inc