М
Молодежь
К
Компьютеры-и-электроника
Д
Дом-и-сад
С
Стиль-и-уход-за-собой
П
Праздники-и-традиции
Т
Транспорт
П
Путешествия
С
Семейная-жизнь
Ф
Философия-и-религия
Б
Без категории
М
Мир-работы
Х
Хобби-и-рукоделие
И
Искусство-и-развлечения
В
Взаимоотношения
З
Здоровье
К
Кулинария-и-гостеприимство
Ф
Финансы-и-бизнес
П
Питомцы-и-животные
О
Образование
О
Образование-и-коммуникации
Марямчик
Марямчик
15.05.2020 02:13 •  Информатика

пожайлуста пожайлуста ​ ">

👇
Открыть все ответы
Ответ:
Sestare852
Sestare852
15.05.2020

Просто прогоняем бинарный поиск дважды, сначала ищем ближайшее число, не большее нужного, потом не меньшее. Для того, чтобы такие числа были, можно дописать в массив очень большое число и очень маленькое. Затем выбираем из этих двух найденных чисел то, что будет ближе.

Пример реализации:

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))

4,6(11 оценок)
Ответ:
kirirllermakov
kirirllermakov
15.05.2020
Const
    n = 25;

var
    a: array[1..n] of real;
    i, j: integer;
    min, max: real;
    sum, product, harmonic: real;

begin
    {ввод массива}
    writeln('Данные массива:');
    for i := 1 to n do
    begin
        a[i] := random(40) - 20;
        write(a[i], ' ');
    end;
    writeln();
    
    {подсчет суммы и произведения и агригатов}
    sum := 0;
    for i := 1 to n do
        sum := sum + a[i];
    writeln('average = ', sum / n);
    
    {минимум и максимум}
    min := a[1];
    for i := 1 to n do
        if min > a[i] then min := a[i];
    writeln('min = ', min);
    
    {подсчет суммы и произведения и агригатов}
    sum := 0;
    for i := 1 to n do
        if i mod 2 = 0 then {если нужен фильтр}
            sum := sum + a[i];
    writeln('sum = ', sum);
end.
4,4(69 оценок)
Это интересно:
Новые ответы от MOGZ: Информатика
logo
Вход Регистрация
Что ты хочешь узнать?
Спроси Mozg
Открыть лучший ответ