Giả sử chúng ta có một mảng gồm n phần tử. Cập nhật tất cả các phần tử của mảng đã cho thành giá trị nhỏ nhất x, sao cho arr [i] =x. Sao cho tích của tất cả các phần tử trong mảng mới lớn hơn tích của tất cả các phần tử của mảng ban đầu, trong đó i <=arr [i] <=10 ^ 10 và 1 <=n <=10 ^ 5. Vì vậy, nếu mảng giống như [4, 2, 1, 10, 6]. Vậy 4 là phần tử nhỏ nhất. 4 * 4 * 4 * 4 * 4> 4 * 2 * 1 * 10 * 6
Như chúng ta biết rằng tích của n phần tử là P. Nếu chúng ta phải tìm căn thứ n của P, để tìm căn thứ n của tích, chúng ta chỉ cần chia n cho tổng log của n phần tử của mảng và sau đó là trần của antilog sẽ là kết quả.
res =ceil (antilog (log (x) / 10))
hoặc res =ceil (10 ^ (log (x) / 10))
Ví dụ
#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); }
Đầu ra
Min value is: 4