计算中位数也出现在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
以上是 计算中位数也出现在C ++中同一子集中的子集数量 的全部内容, 来源链接: utcz.com/z/326298.html