Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Tìm giá trị nhỏ nhất gán cho tất cả phần tử mảng để tích mảng mới lớn hơn tích cũ trong C++


Cho mảng n phần tử, tìm x nhỏ nhất sao cho gán tất cả arr[i]=x thì tích mảng mới > tích mảng cũ. Ví dụ [4,2,1,10,6] → x=4 (4^5 > 4*2*1*10*6).

Tích cũ P, cần x^n > P → x > P^(1/n). Tính log10(P) = sum(log10(arr[i])), x = ceil(10^(log10(P)/n)).

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); }

Kết quả

Min value is: 4