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

중앙값이 C++의 동일한 하위 집합에도 존재하는 하위 집합의 수를 계산합니다.

<시간/>

양수를 포함하는 배열 arr[]이 제공됩니다. 목표는 부분 집합 값의 중앙값도 해당 집합에 나타나도록 ar[] 요소의 부분 집합을 찾는 것입니다.

예를 들어

입력

arr[] = { 1,2,3 }

출력

Count of number of subsets whose median is also present in the same subset are: 4

설명

The sets with their medians in that same set are:
[ 1 ], median is 1
[ 2 ], median is 2
[ 3 ], median is 3
[ 1,2,3 ], median is 2

입력

arr[] = { 4,6,5 }

출력

Count of number of subsets whose median is also present in the same subset are: 4

설명

The sets with their medians in that same set are:
[ 4 ], [ 6 ], [ 5 ], [ 4,6,5 ],

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다. -

이 접근 방식에서는 짝수 및 홀수 크기의 요소를 확인합니다. 그런 다음 홀수 항목의 경우 중앙값이 중간 요소와 동일한 세트에 존재한다는 사실을 기반으로 중앙값을 찾을 수 있습니다. 그래서 우리는 카운트에 2n-1을 추가할 것입니다. 짝수 길이 부분 집합의 경우 두 개의 동일한 요소가 있는지 확인하므로 두 개의 중간 요소가 있는 짝수 길이 부분 집합에 대해 계산합니다.

  • 양수의 배열 arr[]을 가져옵니다.

  • median_subset(arr, size) 함수는 arr을 받아서 중앙값이 같은 부분집합에도 존재하는 부분집합의 개수를 반환합니다.

  • 함수 check(int temp)는 정수를 취하고 for 루프를 사용하여 i=2에서 i<=temp.

    까지 해당 숫자의 계승을 반환합니다.
  • count=count*i를 계산하고 루프의 끝에서 계승으로 반환합니다.

  • 함수 com(int n, int r)은 n과 r을 취하고 nCr 조합의 값을 반환합니다. 이 내부에서 temp =check(r) * check(n − r) 및 temp_2=check(n) / temp를 취합니다. 계산된 값으로 tem_2를 반환합니다.

  • power(int n, int r) 함수는 n과 r을 취하고 nr의 값을 반환합니다.

  • r이 0이면 답은 1이므로 1을 반환합니다.

  • 총계 =거듭제곱(n, r / 2)을 취합니다. ( nr/2)

  • 총계 2 로 총계 업데이트 % 모드. 여기서 mod=1000000007.

  • r이 짝수이면 온도를 (total * n) % mod로 반환하고, 그렇지 않으면 합계를 반환합니다.

  • median_subset() 함수 내에서 count =power(2, size − 1)로 간주하여 홀수 길이 부분 집합의 수입니다.

  • sort(arr, arr + size)를 사용하여 배열 arr[]를 정렬합니다.

  • while 루프를 사용하여 가장 왼쪽 중간 요소가 같을 때까지 각 요소를 확인합니다.

  • temp_2 =size − 1 − temp를 가장 오른쪽 중간 요소의 오른쪽에 있는 요소 수로 취합니다.

  • temp_3 =i를 가장 왼쪽 중간 요소의 왼쪽에 있는 요소 수로 취합니다.

  • count =(count + com(temp_3 +temp_2, temp_3)) % mod로 계산하기 위해 선택한 짝수 길이 하위 집합을 추가합니다.

  • while 루프가 끝나면 count를 갖게 됩니다.

  • 결과로 카운트를 반환합니다.

예시

#include <algorithm>
#include <iostream>
using namespace std;
#define mod 1000000007;
int check(int temp){
   int count = 1;
   for (int i = 2; i <= temp; i++){
      count = count * i;
   }
   return count;
}
int com(int n, int r){
   int temp = check(r) * check(n − r);
   int temp_2 = check(n) / temp;
   return temp_2;
}
int power(int n, int r){
   if (r == 0){
      return 1;
   }
   int total = power(n, r / 2);
   total = (total * total) % mod;
   if (r % 2){
      int temp = (total * n) % mod;
      return temp;
   } else {
      return total;
   }
}
int median_subset(int* arr, int size){
   int count = power(2, size − 1);
   sort(arr, arr + size);
   for (int i = 0; i < size; ++i){
      int temp = i + 1;
      while (temp < size && arr[temp] == arr[i]){
         int temp_2 = size − 1 − temp;
         int temp_3 = i;
         count = (count + com(temp_3 + temp_2, temp_3)) % mod;
         temp++;
      }
   }
   return count;
}
int main(){
   int arr[] = { 4, 5, 4, 6 };
   int size = sizeof(arr) / sizeof(arr[0]);
   cout<<"Count of number of subsets whose median is also present in the same subset are: "<<median_subset(arr, size);
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Count of number of subsets whose median is also present in the same subset are: 9