이분탐색을 사용합니다.
A, B는 각각 2차원 평면 위 점들의 집합이라고 합니다.(A의 크기 = 3, B 의 크기 = 100만)
A에 있는 한 점을 p라고 합니다.
B에 있는 점들 중에서 p 보다 왼쪽에 있는 점들의 집합을 B_left, 오른쪽에 있는 점들의 집합을 B_right라고 합니다. (이분 탐색을 통해서 가능합니다. 이때 사용되는 p의 횟수는 log(100만) 이므로 100만보다 훨씬 적습니다.)
(B에 있는 모든 점 q에 대해서 abs(p.x - q.x) 의 합)
= (B_right에 있는 모든 점 q에 대해서 -(p.x - q.x) 의 합) + (B_left에 있는 모든 점 q에 대해서 (p.x - q.x) 의 합)
= (B_right에 있는 모든 점 q의 갯수)*(-p.x) + (B_right에 있는 모든 점 q에 대해서 q.x의 합) + (B_left에 있는 모든 점 q의 갯수)*(p.x) +(B_right에 있는 모든 점 q에 대해서 -q.x 의 합)
= ((B_left에 있는 모든 점 q의 갯수)-(B_right에 있는 모든 점 q의 갯수))*(p.x) + (B_right에 있는 모든 점 q에 대해서 q.x의 합) + (B_right에 있는 모든 점 q에 대해서 -q.x 의 합)
이렇게 p.x 값을 한번만 써서 x 축 방향 abs 합을 구할 수 있습니다. 마찬가지로 위 아래로 나눠서 y축방향도 구할 수 있구요.
이걸 X에 있는 점 3개에 대해서 전부 하고 그중 제일 작은걸 고르면 됩니다.
desister 1년 전
x[3][2] 라는 배열과 y[1000000][2] 라는 2개의 2차원 배열이 있고, 배열안의 숫자는 모두 랜덤입니다.
이 때, x[3] 중 하나를 골라서 y[1000000] 개에 대해 각각 abs(x[0] - y[0]) + abs(x[1] - y[1]) 값을 구해서
이 값의 합들을 최소화 하는것이 문제인데요.
이 때 x[3] 의 어느 한 index 를 35만개 이상 고를 수 없다는 조건이 붙을 때
어떤 알고리즘으로 최소화값을 구할 수 있을까요..?
(ex. x[0] 37만개, x[1] 30만개, x[2] 33만개 로 abs(x[0] - y[0]) + abs(x[1] - y[1]) 최소 값을 구할 경우 x[0] 를 35만개 이상 구했으므로 무효)