Computer >> 컴퓨터 >  >> 프로그램 작성 >> C 프로그래밍

C에서 k-요소 그룹과 나머지 배열 간의 최대 차이


크기 N과 숫자 k의 정수 배열이 제공됩니다. 배열은 임의의 순서로 정수로 구성됩니다. 작업은 k-요소 그룹과 나머지 어레이 사이의 최대 차이를 찾는 것입니다. 배열은 두 부분으로 나뉩니다. 첫 번째 부분은 제거된 k-요소 그룹이고 두 번째 부분은 배열의 나머지 요소입니다. 두 그룹의 요소 합 간의 차이가 최대가 되도록 k 요소를 선택해야 합니다.

k가 더 작으면(<=배열 크기의 절반) 가장 작은 k 요소의 합이 가장 작고 나머지 N-k 요소의 합이 가장 큽니다. 따라서 최대 차이는 - (나머지 N-k 요소의 합) - (가장 작은 k-요소의 합)입니다.

k가 더 크면(> 배열 크기의 절반) 가장 큰 k 요소의 합이 가장 크고 나머지 N-k 요소의 합이 가장 작습니다. 따라서 최대 차이는 (가장 큰 요소의 합) - (나머지 N-k 요소의 합)입니다.

입력

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

출력 − k-요소 그룹과 나머지 어레이 간의 최대 차이 − 16

설명 − 여기서 k는 더 작아서 최소 3개의 숫자가 가장 작은 합을 갖습니다.

최소 3개의 숫자 - 1,1,2 합계=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, 합계=35

나머지 N-k =4개의 숫자 − 2,2,3,3 합계=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 요소의 합))을 저장합니다. 배열 sum에도 이러한 요소가 있기 때문에 두 번.

    k는 가장 큰 k 요소가 가장 높은 합을 갖는 것보다 큽니다 -

  • D2에 abs((전체 배열의 합) - (2*가장 높은 k 요소의 합))을 저장합니다. 배열 sum에도 이러한 요소가 있기 때문에 두 번.

  • 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