计算中位数也出现在C ++中同一子集中的子集数量

给定一个包含正数的数组arr []。目的是找到arr []元素的子集,以使子集的值的中值也出现在该集合中。

例如

输入值

arr[] = { 1,2,3 }
输出结果
中位数也出现在同一子集中的子集数量计数为: 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 }
输出结果
中位数也出现在同一子集中的子集数量计数为: 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) 接受一个整数并使用从i = 2到i <= temp的for循环返回该数字的阶乘。

  • 计算count = count * i,并在循环结束时将其作为阶乘返回。

  • 功能 com(int n, int r)取n和r并返回组合nCr的值。在此内取temp =check(r) *检查(n-r)和temp_2 =check(n)/温度 返回tem_2作为计算值。

  • 功能 power(int n, int r) 取n和r并返回nr的值。

  • 如果r为0,则答案为1,因此返回1。

  • 取总=功率(n,r / 2)。(nr / 2)

  • 总计更新2%mod。其中mod = 1000000007。

  • 如果r是偶数,则将temp返回为(total * n)%mod,否则返回total。

  • 内部功能 median_subset(),将count作为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循环结束时,我们将进行计数。

  • 返回计数作为结果。

示例

#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<<"中位数也出现在同一子集中的子集数量计数为: "<<median_subset(arr, size);
   return 0;
}
输出结果

如果我们运行上面的代码,它将生成以下输出-

中位数也出现在同一子集中的子集数量计数为: 9

猜你喜欢