Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++에서 배열 곱이 더 커지도록 모든 배열 요소를 할당하는 최소값 찾기

<시간/>

n개의 요소로 구성된 배열이 있다고 가정합니다. arr[i] =x가 되도록 주어진 배열의 모든 요소를 ​​최소값 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을 나눈 다음 안티로그의 상한선 결과가 될 것입니다.

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