Приближенный двоичный поиск - Pascal

Узнай цену своей работы

Формулировка задачи:

Помогите пожалуйста решить задачую Заранее спасибо! Реализуйте алгоритм приближенного бинарного поиска.

Входные данные

В первой строке входных данных содержатся числа N и K (0 < N, K ≤ 100001). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2∙109.

Выходные данные

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.

Примеры

входные данные

5 5 1 3 5 7 9 2 4 8 1 6

выходные данные

1 3 7 1 5

Решение задачи: «Приближенный двоичный поиск»

textual
Листинг программы
  1. program project12;
  2. var
  3.   a,b:array[1 .. 1000] of integer;
  4.   i,n,l,r,m,k,c:integer;
  5. begin
  6.   readln(n,k);
  7.   for i:=1 to n do
  8.     readln(a[i]);
  9.   for i:=1 to k do
  10.     readln(b[i]);
  11.   for i:=1 to k do
  12.     begin
  13.       l:=1;
  14.       r:=n;
  15.       while l<>r do
  16.         begin
  17.           m:=(l+r) div 2;
  18.           if (b[i]<=a[m]) then
  19.             r:=m
  20.           else
  21.             l:=m+1;
  22.         end;
  23.   if(a[r-1]-b[i]<0) then
  24.     c:=(a[r-1]-b[i])*(-1)
  25.   else
  26.     c:=a[r-1]-b[i];
  27.   if (r<>1) and ((a[r]-b[i]<c) or(a[r]-b[i]=0)and(c<>0))or(r=1)then
  28.     writeln(a[r])
  29.   else
  30.     writeln(a[r-1]);
  31.   end;
  32.   readln
  33. end.

Объяснение кода листинга программы

  1. Объявление переменных:
    • a,b: массивы из 1000 целочисленных элементов
    • i,n,l,r,m,k,c: целочисленные переменные
  2. Ввод количества элементов и чисел:
    • Считываем значения n и k с клавиатуры
  3. Ввод значений в массивы:
    • Для каждого i от 1 до n считываем значения и записываем их в массив a
    • Для каждого i от 1 до k считываем значения и записываем их в массив b
  4. Поиск ближайшего числа в массиве a для каждого числа из массива b:
    • Для каждого i от 1 до k:
      • Инициализируем переменные l и r для границ поиска в массиве a
      • Пока левая граница не равна правой:
      • Находим середину массива a и записываем ее в m
      • Если число из массива b меньше или равно числу в середине массива a, сдвигаем правую границу на m, иначе сдвигаем левую границу на m+1
      • Вычисляем ближайшее число к числу из массива b и записываем результат в c
      • Если значение a[r-1]-b[i] отрицательное, умножаем его на -1 и записываем в c
      • Если r не равно 1 и ((значение a[r]-b[i] меньше значения c) или (значение a[r]-b[i] равно 0 и значение c не равно 0)) или r равно 1, то выводим a[r]
      • Иначе выводим a[r-1]
  5. Ожидание ввода перед завершением программы:
    • Считываем любой ввод с клавиатуры Ожидается, что программа написана на языке Pascal.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы