假设我们有一个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