이번 문제는 Platinum V 난이도로 설정된 문제입니다. 정답자도 39명뿐입니다. 난이도에 비해서 많이 풀지 않은 문제입니다.
수학적 지식으로는 산술평균과 기하평균의 대소 비교만 알고 있으면 쉽게 풀 수 있습니다.
수열 A가 있는데, 이 수열에 있는 수들을 합하면 S, 곱하면 P의 값을 가집니다. 예를 들어서 { 1, 3, 2 } 수열이라면, S=6, P=6이 됩니다. 문제는 이러한 S와 P가 주어질 때, 만족하는 양의 실수 수열의 최소 크기를 구하라는 것입니다. 문제에서는 음이 아닌 실수이지만, P의 범위가 1 이상이므로 양의 실수만 생각해도 됩니다. S=6, P=6 이라면, { 1, 3, 2 } 도 되지만, { 6 } 도 가능하므로, 최소 수열의 수 갯수는 1이 됩니다.
이 문제를 풀기 위해서는 산술평균과 기하평균과의 관계를 이용했습니다. 갯수가 n인 수열의 경우 합과 곱은 다음과 같은 부등식으로 표현할 수 있습니다.
\[ \frac{S}{n} \ge \sqrt[n]{P} \]
\[ (\frac{S}{n})^n \ge P \]
모든 원소들이 양의 실수이므로 위의 식은 항상 성립합니다. 등호는 모든 원소들이 동일할 때 성립합니다.
n을 찾을 때에는 이분탐색을 이용했습니다. 만족하는 n 중에 최소값을 찾기 위해서 \( (\frac{S}{n})^n \) 이 최대가 되는 n을 찾습니다. 수학적으로는 \( n = \frac{S}{e} \) 일 때, 최대값을 가집니다. 미분을 한 후에 해당값이 0이 되는 지점입니다.
적절하게 정수 n을 선택한 후, 최대값인 경우에 P보다 작으면 이 문제의 답이 없는 것이므로 -1을 출력합니다. 그 외에는 이분탐색으로 검색하면서 최소값을 찾았습니다.
'Programming > BOJ' 카테고리의 다른 글
[C/C++] 백준 #1365 꼬인 전깃줄(가장 긴 증가하는 부분수열) (0) | 2020.02.04 |
---|---|
#1354 무한 수열 2(Dynamic Programming) (0) | 2020.02.02 |
#1351 무한 수열 (Dynamic Programming) (0) | 2020.02.01 |
#1344 축구(Mathematics) (0) | 2020.01.30 |
#1342 행운의 문자열(Back tracking) (0) | 2020.01.26 |
댓글