Computer >> Máy Tính >  >> Lập trình >> C ++

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

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