문제 분류 수업 진도 대회 채점현황 순위 질문게시판
게임
스도쿠 타이핑 리듬 타자게임 타이핑 테트리스 타이핑 인베이더 타이핑 지뢰찾기 8192 공룡게임 타이핑 플래피버드 랭킹
로그인

8048 : 건물 높이 통일

•시간제한: 2.000 S •메모리제한: 256 MB •제출: 0 •통과: 0 •만든사람: suakii

8048 : 건물 높이 통일

시간 2.000s · 메모리 256MB · 제출 0 · 정답 0

문제 설명

일렬로 나열된 $N$개의 건물이 있습니다. 각 건물 $i$의 현재 높이는 $H_i$이며, 건물의 높이를 1만큼 증가시키거나 감소시키는 데 필요한 비용은 $C_i$입니다.
모든 건물의 높이를 어떤 하나의 임의의 동일한 높이 $X$로 바꾸려 합니다. 이때 필요한 최소 조절 비용의 총합을 구하는 프로그램을 작성하시오.



[제약 조건]
• 테스트 케이스 수 $T$
• $1 \le N \le 10{,}000$
• $0 \le H_i \le 10{,}000$
• $1 \le C_i \le 1{,}000$

입력 설명

첫째 줄에 테스트 케이스의 개수 $T$가 주어집니다.
각 테스트 케이스마다:
첫째 줄에 건물의 수 $N$이 주어집니다. ($1 \le N \le 10,000$)
둘째 줄에 각 건물의 높이 $H_1, H_2, \ldots, H_N$이 공백으로 구분되어 주어집니다. ($0 \le H_i \le 10,000$)
셋째 줄에 각 건물의 단위당 높이 조절 비용 $C_1, C_2, \ldots, C_N$이 공백으로 구분되어 주어집니다. ($1 \le C_i \le 1,000$)

출력 설명

각 테스트 케이스마다 모든 건물의 높이를 통일시키는 데 드는 최소 비용을 한 줄에 하나씩 출력합니다.

입력 예시
COPY
복사되었습니다!

1
4
1 2 3 4
10 10 10 10

출력 예시
COPY
복사되었습니다!

20

도움

높이 $X$에 따른 총 비용 함수 $f(X) = \sum C_i \times |H_i - X|$ 는 극솟값(최솟값)이 단 하나만 존재하는 아래로 볼록한 볼록 함수(Convex Function)입니다.
이와 같은 볼록 함수에서 최솟값을 구할 때는 **삼분 탐색(Ternary Search)**을 유용하게 적용할 수 있습니다. 탐색 구간 $[low, high]$를 삼등분하는 두 점 m1 = low + (high - low)/3, m2 = high - (high - low)/3을 잡고 f(m1)과 f(m2)를 비교해가며 구간을 매번 3분의 2로 줄여나가 $O(N \log(\text{max\_H}))$ 시간에 최적의 높이와 최소 비용을 찾아낼 수 있습니다.

출처/분류

NOTICE  —  BFStudy OJ 정보샘
애들아, 문제 많이 풀고 게임 잠깐 하는거지?
— 정보샘