Просто прогоняем бинарный поиск дважды, сначала ищем ближайшее число, не большее нужного, потом не меньшее. Для того, чтобы такие числа были, можно дописать в массив очень большое число и очень маленькое. Затем выбираем из этих двух найденных чисел то, что будет ближе.
Пример реализации:
def bin_search(arr, target, kind="<="):
assert kind in ["<=", ">="]
if kind == "<=":
comp = lambda a, b: a <= b
else:
comp = lambda a, b: a < b
l = 0
r = len(a) - 1
while l < r - 1:
m = (l + r) // 2
if comp(a[m], target):
l = m
else:
r = m
if kind == "<=":
return arr[l]
else:
return arr[r]
def nearest(arr, target):
nearest_le = bin_search(arr, target, "<=")
nearest_ge = bin_search(arr, target, ">=")
if nearest_ge - target < target - nearest_le:
return nearest_ge
else:
return nearest_le
_ = input()
a = [int(x) for x in input().split()]
a = [float("-Infinity")] + a + [float("+Infinity")]
Microsoft Word - это текстовый редактор от компании Microsoft. Программа обычно входит в пакет офисных программ Microsoft Office, но может поставляться и отдельно. Является платной и стоит просто бешеных денег для организаций (около 19000руб, т.к. продается только в составе пакета Microsoft Office Pro), и больших денег для домашних пользователей (около 4000р), но никого это не смущает, все используют пиратские версии. Программа позволяет редактировать тексты любой сложности, вставлять в документы картинки, таблицы и прочее нестандартное содержимое. Аналогом Microsoft Word является бесплатный Writer из пакета LibreOffice и OpenOffice, который позволяет делать всё то же самое, только бесплатно, хотя и немного сложнее местами. Microsoft Word официально работает только на компьютерах с ОС Microsoft Windows и Apple OS X, хотя возможен и его запуск на ОС семейства Linux через Wine, но корректная работа программы не гарантируется. Microsoft Word является самым распространенным текстовым редактором в мире.
Просто прогоняем бинарный поиск дважды, сначала ищем ближайшее число, не большее нужного, потом не меньшее. Для того, чтобы такие числа были, можно дописать в массив очень большое число и очень маленькое. Затем выбираем из этих двух найденных чисел то, что будет ближе.
Пример реализации:
def bin_search(arr, target, kind="<="):
assert kind in ["<=", ">="]
if kind == "<=":
comp = lambda a, b: a <= b
else:
comp = lambda a, b: a < b
l = 0
r = len(a) - 1
while l < r - 1:
m = (l + r) // 2
if comp(a[m], target):
l = m
else:
r = m
if kind == "<=":
return arr[l]
else:
return arr[r]
def nearest(arr, target):
nearest_le = bin_search(arr, target, "<=")
nearest_ge = bin_search(arr, target, ">=")
if nearest_ge - target < target - nearest_le:
return nearest_ge
else:
return nearest_le
_ = input()
a = [int(x) for x in input().split()]
a = [float("-Infinity")] + a + [float("+Infinity")]
for target in map(int, input().split()):
print(nearest(a, target))