Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному

29.08.2014, 22:00. Показов 1734. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Формат входных данных
В первой строке входных данных содержатся числа N и K (0<N,K<100001 ). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2109.

Формат выходных данных
Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.


Написал программу, но она не работает. Подскажите, что в ней нужно поменять?
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
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.
Добавлено через 23 минуты
26 строчку много раз менял по-разному, но программа либо выдавал ошибку, либо просто неправильный ответ.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2014, 22:00
Ответы с готовыми решениями:

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному
Здравствуйте,помогите пожалуйста написать код,спасибо.Реализуйте алгоритм приближенного бинарного поиска. Входные данные В первой...

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному
Задание: Пример: Входные данные: 5 4 1 4 5 8 10 5 6 1 9 Выходные данные:

Найти число наиболее близкое к заданному для массива 8-разрядных чисел со знаком
Помогите, найти ошибку) format PE console ; 32-разрядная консольная программа WINDOWS EXE entry start ...

11
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.08.2014, 10:06
Цитата Сообщение от Diplomate Посмотреть сообщение
не превосходит 2109.
По моему в условии 2*109

Добавлено через 1 час 7 минут
Судя по коду Вы ищете совпадающие числа, а нужно наиболее близкое к данному.
Т.е что-то типа
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for i:=1 to k do
 begin
  min:=2000000001;
  l:=0;
  r:=n+1;
  while l<r-1 do
   begin
    m:=l+(r-l) div 2;
    if abs(a[m]-b[i])<min then
     begin
      min:=abs(a[m]-b[i]);
      l:=m
     end
    else r:=m;
   end;
  writeln(a[r]);
 end;
Это не решение, а толчок к пониманию...
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
30.08.2014, 21:50  [ТС]
Попробовал сделать, как Вы, но работать программа не стала. По сути введение показателя min почти ничего не меняет. И да, я ищу совпадающие числа. Но ведь цикл все равно должен остановиться на ближайшем к искомому числу, не так ли?
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
31.08.2014, 11:17
Лучший ответ Сообщение было отмечено Diplomate как решение

Решение

Цитата Сообщение от Diplomate Посмотреть сообщение
Но ведь цикл все равно должен остановиться на ближайшем к искомому числу, не так ли?
Нет не так. В цикле ищется только совпадающие числа. И если не находит точно такого, то ничего не выводит. А нужно искать именно ближайшее abs(a-b)<min, в идеальном случае это будет такое же число, min=0.

Добавлено через 13 часов 20 минут
В принципе я тоже не прав, нужно искать так. Это просто пример, но рабочий.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
31.08.2014, 18:12  [ТС]
Вижу, Вы вот этот момент поменяли:
При некоторых примерах
Цитата Сообщение от Puporev Посмотреть сообщение
l:=1;
* r:=n;
А будет ли такой вариант работать? Когда я писал правый и левый двоичные поиски, у меня так не получалось. В общем, попробую Ваш код, надеюсь, что все же заработает.
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
31.08.2014, 18:13
Цитата Сообщение от Diplomate Посмотреть сообщение
А будет ли такой вариант работать?
У меня работает на примере данных с сайта.
1
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
02.09.2014, 19:39  [ТС]
Спасибо, все работает кроме одного теста!
0
Почетный модератор
 Аватар для Puporev
64314 / 47610 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
02.09.2014, 19:55
Не знаете входные данные этого теста? А то я проверил несколько простых вариантов, все работает.

Добавлено через 4 минуты
Ты выложи свой код, я посмотрю.
0
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
02.09.2014, 22:02  [ТС]
Цитата Сообщение от Puporev Посмотреть сообщение
Не знаете входные данные этого теста? А то я проверил несколько простых вариантов, все работает.
Добавлено через 4 минуты
Ты выложи свой код, я посмотрю.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
program a2;
var n,k,l,m,r,i:int32;
a,b:array[1..300000] of int32;
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:=1;
  r:=n;
  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 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;
end.
Я просто переделал программу, добавив твой код. На том сайте проходят все тесты, кроме одного — четвертого. Ума не приложу, что это за тест, причем не я один. Тем с вопросами к этой задаче довольно много, и почти все жалуются на 4 тест. Буду долбить админов, может скажут, что там не так.
0
354 / 135 / 28
Регистрация: 16.12.2012
Сообщений: 607
Записей в блоге: 1
02.09.2014, 23:42
Замените типы переменных, неучавствующих в циклах for, на Int64..
Вот такое сдал..
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
var
    n : LongInt;
    a : array [1..100000] of Int64;
 
function f(k : Int64) : Int64;
var
    l, r, m : Int64;
begin
    l := 1; r := n;
 
    while l < r do begin
        m := l + (r-l) div 2;
        if a[m] >= k then r := m
        else l := m+1
    end;
 
    if (l < n) and (Abs(a[l]-k) > Abs(a[l+1]-k)) then f := a[l+1]
        else if (l > 1) and (Abs(a[l]-k) >= Abs(a[l-1]-k)) then f := a[l-1]
    else f := a[l]
end;
 
var
    k, i : LongInt;
    t : Int64;
begin
    ReadLn(n, k);
    for i := 1 to n do Read(a[i]);
 
    for i := 1 to k do begin
        Read(t);
        WriteLn(f(t))
    end
end.
2
1 / 1 / 0
Регистрация: 10.11.2013
Сообщений: 84
03.09.2014, 21:31  [ТС]
Ромаха, спасибо, помогло. Странно, что при longint и даже при int32 программа не проходит один тест. Учитывая ограничения из условия, тут бы подошел и longint.
Кстати, поменял я не тип переменных, а тип ячеек в массивах. Все это весьма подозрительно.
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
04.09.2014, 18:25
Цитата Сообщение от Diplomate Посмотреть сообщение
Учитывая ограничения из условия, тут бы подошел и longint.
Abs(-2e9+1-2e9), Abs(2e9-1+2e9)
Думаете аргумент функции Abs() влезает в longint?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.09.2014, 18:25
Помогаю со студенческими работами здесь

Для каждого из K чисел вывести в отдельную строку "YES", если число встречается в первом массиве
Здравствуйте,помогите пожалуйста написать код,спасибо.Реализуйте алгоритм бинарного поиска.Входные данные В первой строке входных данных...

В последовательности из n чисел найдите число, наиболее близкое к "x"
В последовательности из n чисел найдите число, наиболее близкое к x. Если к x одинаково близки два числа, выберите большее из них. К...

Найти наиболее близкое число
Вот такое задание: Есть файлик с числами, пользователь вводит b и x, высчитывается функция, потом из файлика должно выбрать наиболее...

Как найти наиболее близкое число в массиве?
Здравствуйте! Есть массив var a = и есть число var b = -620 Как выбрать максимально приближенное число в массиве?

Найти беззнаковое число наиболее близкое к заданному
Напишите пожалуйста программу на Ассемблере. Вот задание: Найти беззнаковое число наиболее близкое к заданному.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru