Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
1

Бинарный поиск

21.10.2018, 23:06. Показов 1767. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Никак не могу понять почему у меня не проходит тесты данный код.
Задача выглядит так:


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

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

Примеры
входные данные
5 5
1 3 5 7 9
2 4 8 1 6
выходные данные
1
3
7
1
5


C++
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
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <cmath>
 
using namespace std;
 
int masn[100000] = {};
 
int bin(int x, int L, int R)
{
    int left, right, m;
    left = L;
    right = R;
    if (x > masn[right - 1])
        return masn[right - 1];
    while (right - left > 1)
    {
        m = (right + left) / 2;
        if (masn[m] == x)
            return masn[m];
        if (masn[m] < x)
            left = m;
        else
            right = m;
    }
    return masn[right - 1];
}
 
int main()
{
    int a, b, mask[100000] = {};
    cin >> a >> b;
    for (int h = 0; h < a; ++h)
        cin >> masn[h];
    for (int h = 0; h < b; ++h)
        cin >> mask[h];
    int j = 0;
    while (j < b)
    {
        cout << bin(mask[j], 0, a) << endl;
        j++;
    }
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2018, 23:06
Ответы с готовыми решениями:

Поиск числа в двумерном массиве (бинарный поиск)
Произвожу поиск элемента в массиве двумя способами: линейным(последовательным) поиском и...

Бинарный поиск
Здравствуйте, не могу понять как составить алгоритм: нужно найти сумму элементов в массиве, которые...

Бинарный поиск
помоги мне плиз ответить на вопросы Бинарный поиск #include &lt;iostream&gt; using namespace std;...

Бинарный поиск
Прочитал статью на хабре, о том, что только 10 проц программистов смогут реализовать бин поиск....

10
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
21.10.2018, 23:29 2
Цитата Сообщение от EVGENNIY1337 Посмотреть сообщение
Никак не могу понять почему у меня не проходит тесты данный код.
потому что бинпоиск работает только в отсортированных массивах, а не в едва лишь введённом.

Добавлено через 8 минут
потому что находится не ближайшее число, а ближайшее слева число

Добавлено через 7 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int bin(int x, int L, int R)
{
    int left, right, m;
    left = L;
    right = R;
    if (x > masn[right - 1])
        return masn[right - 1];
    while (right - left > 2)
    {
        m = (right + left) / 2;
        if (masn[m] == x)
            return masn[m];
        if (masn[m] < x)
            left = m;
        else
            right = m;
    }
    if (masn[right - 1] - x > x - masn[left])
        return masn[left];
    return masn[right - 1];
}
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
22.10.2018, 14:28  [ТС] 3
вот вывод этого кода:
5 5
1 3 5 7 9
2 4 8 1 6
3
3
9
1
5
что не верно
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
22.10.2018, 14:41 4
смотрим в массиве 1 3 5 7 9 найти ближайшее к 2 число, если таких несколько - вывести левое
на запрос 2 ответ? может 1? нет, 3
на 4 - 3 верно
на 8 - 9 опять не так
на 1 - 1 и на 5-5 в этом сомнений и не было, сомнения в поиске ближайших слева чисел.
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
22.10.2018, 15:08  [ТС] 5
Цитата Сообщение от EVGENNIY1337 Посмотреть сообщение
наиболее близкое к данному. Если таких несколько, выведите меньшее из них.
1 3 одинаково близки к 2, а меньшее из них - 1, но ваш код выводит 3
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
22.10.2018, 15:22 6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int bin(int x, int L, int R)
{
    int left, right, m;
    left = L;
    right = R;
    if (x > masn[right - 1])
        return masn[right - 1];
    while (right - left > 2)
    {
        m = (right + left) / 2;
        if (masn[m] == x)
            return masn[m];
        if (masn[m] < x)
            left = m;
        else
            right = m;
    }
    if (masn[right - 1] - x >= x - masn[left])
        return masn[left];
    return masn[right - 1];
}
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
22.10.2018, 15:26  [ТС] 7
ваш код выполняет ровно те же тесты, как и мой, только чуть медленнее, и не проходит все требуемые тесты
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
22.10.2018, 15:31 8
какие ещё нафиг тесты?
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
22.10.2018, 15:53  [ТС] 9
в протоколе пишется:



Статистика
Параметр Значение Тест
Первый непройденный тест Неправильный ответ 2
Максимальное процессорное время 0.282 19
Максимальный расход памяти 2613248 19
Максимальное астрономическое время 0.285 19
Тест Статус Балл Время работы Астрономическое время работы Используемая память
1 OK 0 0.001 2199552
2 Неправильный ответ 0 0.001 2199552
3 Неправильный ответ 0 0.002 2199552
4 OK 0 0.001 2199552
5 OK 0 0.001 2199552
6 Неправильный ответ 0 0.001 2199552
7 OK 0.027 0.029 2199552
8 OK 0.026 0.027 2199552
9 OK 0.026 0.027 2199552
10 Неправильный ответ 0.027 0.029 2199552
11 Неправильный ответ 0.026 0.027 2199552
12 Неправильный ответ 0.026 0.027 2199552
13 Неправильный ответ 0.028 0.029 2199552
14 Неправильный ответ 0.027 0.028 2199552
15 Неправильный ответ 0.027 0.028 2199552
16 Неправильный ответ 0.029 0.03 2199552
17 Неправильный ответ 0.027 0.028 2199552
18 Неправильный ответ 0.272 0.274 2609152
19 Неправильный ответ 0.282 0.285 2613248
20 Неправильный ответ 0.277 0.28 2609152
21 Неправильный ответ 0.275 0.277 2609152
22 OK 0 0.001 2199552
0
4264 / 3323 / 925
Регистрация: 25.03.2012
Сообщений: 12,519
Записей в блоге: 1
22.10.2018, 16:22 10
Лучший ответ Сообщение было отмечено EVGENNIY1337 как решение

Решение

C++
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
34
35
36
37
38
39
40
41
42
43
44
#include <iostream>
#include <cmath>
 
using namespace std;
 
int masn[100000] = {};
 
int bin(int x, int L, int R)
{
    int left, right, m;
    left = L;
    right = R;
    if (x > masn[right])
        return masn[right];
    while (right - left > 1)
    {
        m = (right + left) / 2;
        if (masn[m] == x)
            return masn[m];
        if (masn[m] < x)
            left = m;
        else
            right = m;
    }
    if (masn[right] - x >= x - masn[left])
        return masn[left];
    return masn[right];
}
int a, b, mask[100000] = {};
int main()
{
    cin >> a >> b;
    for (int h = 0; h < a; ++h)
        cin >> masn[h];
    for (int h = 0; h < b; ++h)
        cin >> mask[h];
    int j = 0;
    while (j < b)
    {
        cout << bin(mask[j], 0, a-1) << endl;
        j++;
    }
    return 0;
}
0
0 / 0 / 0
Регистрация: 25.07.2018
Сообщений: 31
22.10.2018, 16:31  [ТС] 11
спасибо
0
22.10.2018, 16:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2018, 16:31
Помогаю со студенческими работами здесь

Бинарный поиск
Написал программу бинарного поиска элемента v. Не могу понять в чем ошибка, не считает количество...

Бинарный поиск
Заполнить массив случайными числами и отсортировать его. Ввести число X. Используя двоичный поиск,...

Бинарный поиск
Здравствуйте, помогите пожалуйста написать бинарный поиск одного элемента, текст читается из файла....

Бинарный поиск c++
1) последовательного поиска максимального элемента в одномерном динамическом массиве; 2) бинарного...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru