在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個元素的對數之和,然後取反對數的上限即可得到結果。
res = ceil(antilog(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
廣告