BOJ 16642 Cake Cutting

BOJ 16642 Cake Cutting

문제 링크:

문제 내용

생략

문제 풀이

스포일러

먼저 반지름을 RR로 나누어 단위원으로 만들어 줍니다. 그러면 이 단위원을 세로로 자른 영역의 면적은 다음과 같이 구할 수 있습니다.

lr21x2dx=[arcsinx+x1x2]lr\int_{l}^{r} {2\sqrt{1-x^2} dx} = \left\lbrack \arcsin{x} + x \sqrt{1 - x^2} \right\rbrack _l ^r

위의 값을 f(l,r)f(l, r)이라고 합시다.

이제 각 영역 내에서 cost function을 최소화하는 값을 구해야 합니다. ii번째 영역의 왼쪽과 오른쪽 경계를 각각 x=l,x=rx = l, x = r이라고 하고, x<lx < lx>lx > l의 영역에 있는 빵과 크림의 양을 각각 Vl,Vr,vl,vrV_l, V_r, v_l, v_r이라고 하면, cost function은 다음과 같이 적을 수 있습니다.

(VlVr+2hf(l,x))2+(vlvr+2bif(l,x))2(V_l - V_r + 2h f(l, x))^2 + (v_l - v_r + 2b_i f(l, x))^2

이는 f(l,x)f(l, x)에 대한 이차함수이며, hhbib_i가 모두 양수이므로 이 함수는 미분값이 0이 되는 지점 f(l,x)=h(VrVl)+bi(vrvl)2h2+2bi2f(l, x) = \frac{h (V_r - V_l) + b_i (v_r - v_l)}{2h^2 + 2b_i^2}에서 최솟값을 갖습니다. f(l,x)f(l, x)lxrl \le x \le r에서 0f(l,x)f(l,r)0 \le f(l, x) \le f(l, r)로 단조증가하므로, 이 지점이 이 범위 내에 있다면 위의 cost function에 직접 대입하여 극값을 얻을 수 있습니다. 그렇지 않다면 양 끝점을 대입해본 값을 확인합니다.

풀이를 시작할 때 길이를 RR로 나누었으므로 최종 출력값을 보정해 줘야 하는데, 구하는 값은 길이의 네제곱의 차원을 가지므로 R4R^4를 곱해서 출력하면 됩니다.

그런데 이 문제에서는 실수 오차도 주의해야 합니다. 특히 입력값으로부터 arcsinx\arcsin x를 구하는 과정에서 실수 오차가 크게 증폭될 수 있습니다. 입력값이 최대 소수점 이하 3자리까지 들어온다는 점을 이용하여, 입력에 1000을 곱한 값을 정수로 만들어서 누적 합을 구한 다음 1000R1000R로 나누어 arcsin\arcsin 함수의 입력으로 사용하여야 실수 오차에 의한 WA를 피할 수 있습니다.

Last updated on