@sasha_zaitsev

Как реализовать приближенный двоичный поиск?

Реализуйте алгоритм приближенного бинарного поиска.
Входные данные
В первой строке входных данных содержатся числа N и K (0NK100001 ). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2*10^9.
Выходные данные
Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.
Где ошибка?
const q=100000;
type s = array[1..q] of integer;                                                                        
var mas,mas2: s;
var n,k,i,l,r,c: integer;
begin
readln(n,k);
for i:=1 to n do read(mas[i]);
for i:=1 to k do read(mas2[i]);
for i:=1 to k do
   begin
   l:=1;
   r:=n+1;
   while l<r-1 do
      begin
      c:=(l+r) div 2;
      if mas2[i]<mas[c] then
         r:=c
      else
         l:=c;
      end;
   if l<>r then
     begin
      if abs(mas[r]-mas2[i])<abs(mas[l]-mas2[i]) then
         writeln(mas[r])
      else writeln(mas[l]);
     end
    else writeln(mas[l])
   end;
end.
  • Вопрос задан
  • 6473 просмотра
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Как минимум ваш двоичный поиск может закончиться с r = n+1, из-за чего код в if l <> r не будет работать.
Ответ написан
@Mercury13
Программист на «си с крестами» и не только
Алгоритм такой.
1. Реализуй двоичный поиск с указанием места, куда вставить (см. Википедию).
2. Если вставить до первой позиции или за последнюю — return соотв. первое или последнее число.
3. В противном случае выяснить, какое ближе из (i−1)-го и i-го.

Дома проверю, где там ошибка в двоичном поиске, в нём любят ошибаться.

К тому же код у вас чисто олимпиадный, я бы отделил рабочую логику от генерации выходного файла.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы