Advertisement
alex0sunny

golden_middle

Nov 20th, 2021
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.92 KB | None | 0 0
  1. # Используем полуинервал, не включаем right.
  2. # Возвращаем две серединные точки, если в массиве нечётное количество элементов,
  3. # то это одна и та же точка.
  4. def get_middles(left, right):
  5.     mid_left = (left + right - 1) // 2
  6.     mid_right = (left + right) // 2
  7.     return mid_left, mid_right
  8.  
  9.  
  10. def find_median(a, b):
  11.     if len(a) > len(b):
  12.         a, b = b, a
  13.     left_a = left_b = 0
  14.     right_a = len(a)
  15.     right_b = len(b)
  16.     while True:
  17.         mid_a_left, mid_a_right = get_middles(left_a, right_a)
  18.         mid_b_left, mid_b_right = get_middles(left_b, right_b)
  19.         offset = mid_a_left - left_a
  20.         if offset == 0:   # осталось не больше 2-х элементов
  21.             break
  22.         if a[mid_a_left] <= b[mid_b_left] and b[mid_b_right] <= a[mid_a_right]:
  23.             return (b[mid_b_left] + b[mid_b_right]) / 2
  24.         elif b[mid_b_left] <= a[mid_a_left] and a[mid_a_right] <= b[mid_b_right]:
  25.             return (a[mid_a_left] + a[mid_a_right]) / 2
  26.         elif b[mid_b_right] <= a[mid_a_right]:   # сдвигаем в a справа
  27.             right_a -= offset
  28.             left_b += offset
  29.         else:   # a[mid_a_left] < b[mid_b_left], сдвигаем в a слева
  30.             left_a += offset
  31.             right_b -= offset
  32.     offset = int(left_b < mid_b_left)   # offset равен единице, если в b осталось
  33.                                         # больше 2-х элементов.
  34.     c = sorted(a[left_a:right_a] + b[mid_b_left-offset: mid_b_right+offset+1])
  35.     mid_c_left, mid_c_right = get_middles(0, len(c))
  36.     return (c[mid_c_left] + c[mid_c_right]) / 2
  37.  
  38.  
  39. input()
  40. input()
  41. nord_amounts = [int(x) for x in input().split()]
  42. south_amounts = [int(x) for x in input().split()]
  43. print(find_median(nord_amounts, south_amounts))
  44.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement