Advertisement
alex0sunny

golden middle

Aug 29th, 2021 (edited)
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.61 KB | None | 0 0
  1. input()
  2. input()
  3. nord_amounts = [int(x) for x in input().split()]
  4. south_amounts = [int(x) for x in input().split()]
  5.  
  6.  
  7. def get_median(a, left, right):
  8.     return (a[(left + right) // 2] + a[(left + right + 1) // 2]) / 2
  9.  
  10.  
  11. def find_median(a, b):
  12.     if len(a) > len(b):
  13.         a, b = b, a
  14.     left_a = left_b = 0
  15.     right_a = len(a) - 1
  16.     med_a = get_median(a, left_a, right_a)
  17.     right_b = len(b) - 1
  18.     med_b = get_median(b, left_b, right_b)
  19.     while med_a != med_b and right_a > left_a:
  20.         offset = (right_a - left_a + 1) // 2
  21.         if med_a > med_b:   # сдвигаем в a справа
  22.             right_a -= offset
  23.             left_b += offset
  24.         else:
  25.             left_a += offset
  26.             right_b -= offset
  27.         med_a = get_median(a, left_a, right_a)
  28.         med_b = get_median(b, left_b, right_b)
  29.  
  30.     # Вероятно в этом месте в 20м тесте left_a на единицу меньше, чем должно быть. Почему?
  31.  
  32.     if med_a == med_b:
  33.         return med_a
  34.     if left_b == right_b:
  35.         return (med_a + med_b) / 2
  36.     if (right_b - left_b) % 2:  # чётное количество элементов осталось
  37.         left_b = (left_b + right_b - 1) // 2
  38.         right_b = left_b + 1
  39.     else:   # осталось нечётное количество элементов
  40.         mid = (left_b + right_b) // 2
  41.         left_b = mid - 1
  42.         right_b = mid + 1
  43.     c = b[left_b:right_b + 1]
  44.     c.append(a[left_a])
  45.     c.sort()
  46.     return get_median(c, 0, len(c) - 1)
  47.  
  48.  
  49. print(find_median(nord_amounts, south_amounts))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement