Для каждого из 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.

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

  1. Объявлены константы: n=5, k=4.
  2. Объявлены массивы: a[1..n] и b[1..k].
  3. Объявлены переменные: i, j, l, r, m.
  4. Задана инициализация массива a.
  5. Задана инициализация массива b.
  6. В цикле выводятся элементы массива a.
  7. В цикле выводятся элементы массива b.
  8. Задана инициализация переменных l и r.
  9. В цикле находим середину массива a и сравниваем a[m] с b[i].
  10. Если a[m] больше b[i], то обновляем значение переменной r.
  11. Если a[m] меньше или равно b[i], то обновляем значение переменной l.
  12. Если l не равно r, то в цикле сравниваем разницу между a[r] и b[i] и разницу между a[l] и b[i].
  13. Если abs(a[r]-b[i]) меньше abs(a[l]-b[i]), то выводим a[r].
  14. Если abs(a[r]-b[i]) больше или равно abs(a[l]-b[i]), то выводим a[l].
  15. Если l равно r, то выводим a[l].
  16. Задана инициализация переменной m.
  17. Задана инициализация переменной i.
  18. Задана инициализация переменной j.
  19. Задана инициализация переменной n.
  20. Задана инициализация переменной k.

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


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

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

6   голосов , оценка 4.5 из 5
Похожие ответы