Просто прогоняем бинарный поиск дважды, сначала ищем ближайшее число, не большее нужного, потом не меньшее. Для того, чтобы такие числа были, можно дописать в массив очень большое число и очень маленькое. Затем выбираем из этих двух найденных чисел то, что будет ближе.
Пример реализации:
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")]
Задача 1 var x,y:integer; begin writeln('Введите х'); readln(x); writeln('Введите y'); readln(y); if x<y then writeln('Меньшее: ',x) else if x>y then writeln('Меньшее: ',y) else if x=y then writeln('Числа равны') end.
задача 2 var x,y:integer; begin writeln('Введите первое число'); readln(x); writeln('Введите второе число'); readln(y); if y=0 then writeln('Второе число равно 0. Деление невозможно!') else writeln(x,'/',y,'=',x/y); end.
задача 3 var s,name:string; begin writeln('Введите ваше имя'); readln(name); writeln('Введите строку'); readln(s); if s=name then writeln('Привет!') else writeln('Здравствуйте!'); end.
задача 4 var x:integer; begin writeln('Введите число'); readln(x); if (x mod 2)=0 then writeln('Четное') else writeln('Нечетное') end.
задача 5 var x:string; i:integer; begin writeln('Введите строку'); readln(x); writeln('Введите номер символа'); readln(i); if i > length(x) then writeln('Нет символа!') else writeln(x[i]) end.
задача 6 var x,y:integer; begin writeln('Количество яблок:'); readln(x); writeln('Количество апельсинов:'); readln(y); if (x*100)>(y*150) then writeln('Берите яблоки') else if (x*100)<(y*150) then writeln('Берите апельсины') else if (x*100)=(y*150) then writeln('Вес яблок и апельсинов одинаковый') end.
Просто прогоняем бинарный поиск дважды, сначала ищем ближайшее число, не большее нужного, потом не меньшее. Для того, чтобы такие числа были, можно дописать в массив очень большое число и очень маленькое. Затем выбираем из этих двух найденных чисел то, что будет ближе.
Пример реализации:
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))
var
x,y:integer;
begin
writeln('Введите х');
readln(x);
writeln('Введите y');
readln(y);
if x<y then writeln('Меньшее: ',x) else
if x>y then writeln('Меньшее: ',y) else
if x=y then writeln('Числа равны')
end.
задача 2
var
x,y:integer;
begin
writeln('Введите первое число');
readln(x);
writeln('Введите второе число');
readln(y);
if y=0 then writeln('Второе число равно 0. Деление невозможно!') else
writeln(x,'/',y,'=',x/y);
end.
задача 3
var
s,name:string;
begin
writeln('Введите ваше имя');
readln(name);
writeln('Введите строку');
readln(s);
if s=name then writeln('Привет!') else
writeln('Здравствуйте!');
end.
задача 4
var
x:integer;
begin
writeln('Введите число');
readln(x);
if (x mod 2)=0 then writeln('Четное') else writeln('Нечетное')
end.
задача 5
var
x:string;
i:integer;
begin
writeln('Введите строку');
readln(x);
writeln('Введите номер символа');
readln(i);
if i > length(x) then writeln('Нет символа!') else writeln(x[i])
end.
задача 6
var
x,y:integer;
begin
writeln('Количество яблок:');
readln(x);
writeln('Количество апельсинов:');
readln(y);
if (x*100)>(y*150) then writeln('Берите яблоки')
else
if (x*100)<(y*150) then writeln('Берите апельсины')
else
if (x*100)=(y*150) then writeln('Вес яблок и апельсинов одинаковый')
end.