查找最小值以分配所有数组元素,以使数组乘积在C ++中变得更大
假设我们有一个n个元素的数组。将给定数组的所有元素更新为某个最小值x,以使arr[i]=x。这样,新数组中所有元素的乘积严格大于初始数组中所有元素的乘积,其中i<=arr[i]<=10^10,而1<=n<=10^5。因此,如果数组类似于[4,2,1,10,6]。因此4是最小的元素。4*4*4*4*4>4*2*1*10*6
我们知道n个元素的乘积是P。如果必须找到P的第n个根,要找到乘积的第n个根,我们只需将n从数组n个元素的对数之和除以antilog的上限即可将是结果。
res=ceil(对数(log(x)/10))
或res=ceil(10^(log(x)/10))
示例
#include <iostream>
#include <cmath>
#define EPS 1e-15
using namespace std;
long long findMinValue(long long arr[], long long n) {
long double sum = 0;
for (int i=0; i<n; i++)
sum += (long double)log10(arr[i])+EPS;
long double xl = (long double)(sum/n+EPS);
long double res = pow((long double)10.0, (long double)xl) + EPS;
return (long long)ceil(res+EPS);
}
int main() {
long long arr[] = {4, 2, 1, 10, 6};
long long n = sizeof(arr)/sizeof(arr[0]);
cout << "Min value is: "<< findMinValue(arr, n);
}输出结果
Min value is: 4