Приближенный двоичный поиск - 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
Листинг программы
program project12;
var
  a,b:array[1 .. 1000] of integer;
  i,n,l,r,m,k,c:integer;
begin
  readln(n,k);
  for i:=1 to n do
    readln(a[i]);
  for i:=1 to k do
    readln(b[i]);
  for i:=1 to k do
    begin
      l:=1;
      r:=n;
      while l<>r do
        begin
          m:=(l+r) div 2;
          if (b[i]<=a[m]) then
            r:=m
          else
            l:=m+1;
        end;
  if(a[r-1]-b[i]<0) then
    c:=(a[r-1]-b[i])*(-1)
  else
    c:=a[r-1]-b[i];
  if (r<>1) and ((a[r]-b[i]<c) or(a[r]-b[i]=0)and(c<>0))or(r=1)then
    writeln(a[r])
  else
    writeln(a[r-1]);
  end;
  readln
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
Похожие ответы