查找最小值以分配所有数组元素,以使数组乘积在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