Приближенный двоичный поиск - 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.
Объяснение кода листинга программы
- Объявление переменных:
a,b
: массивы из 1000 целочисленных элементовi,n,l,r,m,k,c
: целочисленные переменные
- Ввод количества элементов и чисел:
- Считываем значения
n
иk
с клавиатуры
- Считываем значения
- Ввод значений в массивы:
- Для каждого
i
от 1 доn
считываем значения и записываем их в массивa
- Для каждого
i
от 1 доk
считываем значения и записываем их в массивb
- Для каждого
- Поиск ближайшего числа в массиве
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]
- Инициализируем переменные
- Для каждого
- Ожидание ввода перед завершением программы:
- Считываем любой ввод с клавиатуры Ожидается, что программа написана на языке Pascal.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д