Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному - Free Pascal
Формулировка задачи:
Формат входных данных
В первой строке входных данных содержатся числа N и K (0<N,K<100001 ). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2109.
Формат выходных данных
Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.
Написал программу, но она не работает. Подскажите, что в ней нужно поменять?
Листинг программы
- program a2;
- var n,k,l,m,r,i:longint;
- a,b:array[1..300000] of longint;
- begin
- assign(input,'input.txt');
- reset(input);
- assign(output,'output.txt');
- rewrite(output);
- read(n,k);
- readln;
- for i:=1 to n do
- read(a[i]);
- readln;
- for i:=1 to k do
- read(b[i]);
- for i:=1 to k do
- begin
- l:=0;
- r:=n+1;
- while l<r-1 do
- begin
- m:=l+(r-l) div 2;
- if a[m]<b[i] then l:=m
- else r:=m;
- end;
- if a[r]=b[i] then writeln(a[r]);
- end;
- end.
26 строчку много раз менял по-разному, но программа либо выдавал ошибку, либо просто неправильный ответ.
Решение задачи: «Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному»
textual
Листинг программы
- uses crt;
- const n=5;
- k=4;
- a:array[1..n] of integer=(1,4,5,8,10);
- b:array[1..k] of integer=(5,6,1,9);
- var i,j,l,r,m:integer;
- begin
- clrscr;
- for i:=1 to n do
- write(a[i]:3);
- writeln;
- for i:=1 to k do
- write(b[i]:3);
- writeln;
- for i:=1 to k do
- begin
- l:=1;
- r:=n;
- for j:=1 to n do
- begin
- m:=(l+r) div 2;
- if a[m]>b[i] then r:=m else l:=m;
- end;
- if l<>r then
- begin
- if abs(a[r]-b[i])<abs(a[l]-b[i]) then writeln(a[r])
- else writeln(a[l]);
- end
- else writeln(a[l])
- end;
- readln
- end.
Объяснение кода листинга программы
- Объявлены константы: n=5, k=4.
- Объявлены массивы: a[1..n] и b[1..k].
- Объявлены переменные: i, j, l, r, m.
- Задана инициализация массива a.
- Задана инициализация массива b.
- В цикле выводятся элементы массива a.
- В цикле выводятся элементы массива b.
- Задана инициализация переменных l и r.
- В цикле находим середину массива a и сравниваем a[m] с b[i].
- Если a[m] больше b[i], то обновляем значение переменной r.
- Если a[m] меньше или равно b[i], то обновляем значение переменной l.
- Если l не равно r, то в цикле сравниваем разницу между a[r] и b[i] и разницу между a[l] и b[i].
- Если abs(a[r]-b[i]) меньше abs(a[l]-b[i]), то выводим a[r].
- Если abs(a[r]-b[i]) больше или равно abs(a[l]-b[i]), то выводим a[l].
- Если l равно r, то выводим a[l].
- Задана инициализация переменной m.
- Задана инициализация переменной i.
- Задана инициализация переменной j.
- Задана инициализация переменной n.
- Задана инициализация переменной k.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д