Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Используем полуинервал, не включаем right.
- # Возвращаем две серединные точки, если в массиве нечётное количество элементов,
- # то это одна и та же точка.
- def get_middles(left, right):
- mid_left = (left + right - 1) // 2
- mid_right = (left + right) // 2
- return mid_left, mid_right
- def find_median(a, b):
- if len(a) > len(b):
- a, b = b, a
- left_a = left_b = 0
- right_a = len(a)
- right_b = len(b)
- while True:
- mid_a_left, mid_a_right = get_middles(left_a, right_a)
- mid_b_left, mid_b_right = get_middles(left_b, right_b)
- offset = mid_a_left - left_a
- if offset == 0: # осталось не больше 2-х элементов
- break
- if a[mid_a_left] <= b[mid_b_left] and b[mid_b_right] <= a[mid_a_right]:
- return (b[mid_b_left] + b[mid_b_right]) / 2
- elif b[mid_b_left] <= a[mid_a_left] and a[mid_a_right] <= b[mid_b_right]:
- return (a[mid_a_left] + a[mid_a_right]) / 2
- elif b[mid_b_right] <= a[mid_a_right]: # сдвигаем в a справа
- right_a -= offset
- left_b += offset
- else: # a[mid_a_left] < b[mid_b_left], сдвигаем в a слева
- left_a += offset
- right_b -= offset
- offset = int(left_b < mid_b_left) # offset равен единице, если в b осталось
- # больше 2-х элементов.
- c = sorted(a[left_a:right_a] + b[mid_b_left-offset: mid_b_right+offset+1])
- mid_c_left, mid_c_right = get_middles(0, len(c))
- return (c[mid_c_left] + c[mid_c_right]) / 2
- input()
- input()
- nord_amounts = [int(x) for x in input().split()]
- south_amounts = [int(x) for x in input().split()]
- print(find_median(nord_amounts, south_amounts))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement