AtCoder ABC294 F - Sugar Water 2
이분 탐색은 알았는데, 결정 함수를 짜는 방법을 모르겠어서 에디토리얼을 참고했다.
아이디어Permalink
우리가 정답인 농도를 이분탐색으로 구하는데, 개의 조합 중, 현재 보고 있는 농도 보다 높은 것의 개수를 구한다.
그것이 이상이라면 를 더 높여주고, 아니면 낮춰주면서 정답을 찾아낸다.
결정 함수Permalink
의 농도에 대해 개의 조합의 농도 중 몇개가 보다 작을까?
설탕물이 의 설탕과 의 물로 이루어져 있다고 하자.
이것이 가 되는 설탕의 양을 로 정의한다.
실제로 그런것은 아니지만 물에 있는 설탕의 비율을 로 두어도 문제없다.
농도는 같은 상수를 제거하고 ratio만 따져도 충분하다.
이제 여기서 라면 그램의 설탕이 더 있다는 것이고
라면 의 설탕이 부족하다는 것이다.
의 설탕이 부족하다는 것을 만큼의 음의 설탕이 더 있다고 재정의함으로써, 우린 항상 만큼의 설탕에 대해서만 다룰 수 있다.
매번 결정함수마다 다음과 같은 작업을 한다.
- 을 Aoki가 가진 설탕물들에 대해서 라고 하자.
- 를 정렬한다.
- Takahashi의 설탕물들을 다음과 같이 처리한다.
- 를 현재 설탕 물의 라고 하면, Aoki가 가진 것 중 가 최소 이상이여야 이상의 농도가 나오므로 이분 탐색으로 개수를 찾아주면 된다.
코드Permalink
후기Permalink
이 문제에서 놓쳤던 것은 결정 함수의 작성에서 에 대해서 한 번의 결정함수마다 무언가 정렬을 새롭게 해줄 수 있다는 사실이다.
이런 테크닉은 처음 알았다.
아예 이분 탐색이 들어가기 전에 어떻게든 배열을 먼저 정렬해두고 풀어야 된다는 생각이 있었고, 그것이 못 푼 원인이다.
Comments