[Python] 백준 10791 - Qanat

JongPark·2022년 5월 19일
2

Baekjoon

목록 보기
7/11
post-thumbnail

너비가 ww이고 높이가 hh인 직각삼각형 모양의 Qanat\mathsf{Qanat}가 있습니다. 초기 상태에는 구멍이 뚫려있지 않으며 왼쪽 꼭짓점과 위쪽 꼭짓점에서 물을 끌어 올립니다.

추가적으로 수직 구멍을 nn개 뚫으면 구멍을 뚫은 삼각형 빗변에서 추가적으로 물을 끌어 올릴 수 있습니다.

물을 끌어 올릴 때에는 추가 비용이 들어가는데, 이 때 nn개의 수직 구멍을 적절히 뚫어 물을 끌어 올리는데 사용되는 비용을 최소화시키는 문제입니다.

구멍을 뚫은 좌표를 x1,x2,x3xnx_1,x_2,x_3\cdots x_n라고 했을 때, 비용에 대한 수식은 아래와 같습니다.

f(x)=a1(x1k1x2)2+a2(x2k2x3)2+an(xnknw)2+Cf_{(x)}=a_1(x_1-k_1x_2)^2+a_2(x_2-k_2x_3)^2+\cdots a_n(x_n-k_nw)^2+C

이 때 간단한 수학적 계산을 통하여 a1a_1=12,\frac{1}{2}, ki=1r24aik_i=\frac{1-r^2}{4a_i}, ai+1=12aiki2a_{i+1}=\frac{1}{2}-a_ik_i^2 라는 사실들을 알 수 있습니다. ( 이 때, r=hw<1)r=\frac{h}{w}<1)

모든 ii에 대해 0<ki<10<k_i<1을 만족하므로 f(x)f_{(x)}의 최솟값은 CC라는 사실을 알 수 있고, 그 때 x1,x2,x3xnx_1,x_2,x_3\cdots x_n의 값들도 구할 수 있습니다.

a = [0]
k = [0]
w, h, n = map(int, input().split())
x = [w]
r = h / w
a.append(0.5)
for i in range(1, n + 1):
    k.append((1 - r * r) / a[i] / 4)
    a.append(0.5 - a[i] * k[i] * k[i])
result = (a[n + 1] - 0.5 + (r + 1) ** 2 / 4) * w ** 2
for i in range(n + 1)[::-1]:
    x.insert(0, x[0] * k[i])
print(f'{result:.6f}')
i = 1
while i <= n and i < 11:
    print(f'{x[i]:.6f}')
    i += 1

0개의 댓글