Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 04.11.2022
Сообщений: 6

Сложность двоичного поиска

06.11.2022, 08:09. Показов 3953. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача. Вася загадал число от 1 до N. За какое наименьшее количество вопросов (на которые Вася отвечает «да» или «нет») Петя может заведомо угадать Васино число?
Входные данные:
Вводится одно натуральное число N, не превосходящее 10000.
Выходные данные:
Выведите наименьшее количество вопросов, которого гарантированно хватит Пете, чтобы угадать Васино число.
Пример.
Ввод:
5
Вывод:
3

Мой код ломается на 5 тесте. Можете, пожалуйста, показать, в чём проблема моего подхода?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <algorithm>
 
int cnt = 0;
 
int log(int N){
  cnt += 1;
  if (N == 1){
    return cnt;
  } else {
    return log(N/2);
  }
}
 
int main() {
  int N;
  std::cin >> N;
  std::cout << log(N);
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2022, 08:09
Ответы с готовыми решениями:

Бинарный поиск (Сложность двоичного поиска)
Вася загадал число от 1 до N. За какое наименьшее количество вопросов (на которые Вася отвечает &quot;да&quot; или &quot;нет&quot;) Петя...

Сложность бинарного поиска
Добрый вечер, решал данную задачу: Девочка загадала число от 1 до N. За какое наименьшее количество вопросов вида «Загаданное тобой...

Сложность бинарного поиска
#include &lt;iostream&gt; using namespace std; int main() { double n; int k=0; cin&gt;&gt;n; while (n&gt;1)...

13
place status here
 Аватар для gunslinger
3190 / 2226 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
06.11.2022, 12:25
log - это натуральный логарифм. Возможен конфликт имен.
Цитата Сообщение от Kwalit Посмотреть сообщение
Мой код ломается на 5 тесте. Можете, пожалуйста, показать, в чём проблема моего подхода?
Знать бы, что это за тест №5.

А правильный ответ, могу предположить, следующий:
C++
1
  N / 2 + N % 2;
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.11.2022, 14:28
Цитата Сообщение от Kwalit Посмотреть сообщение
За какое наименьшее количество вопросов (на которые Вася отвечает «да» или «нет») Петя может заведомо угадать Васино число?
за один. Возьмёт и угадает с первого раза.
0
place status here
 Аватар для gunslinger
3190 / 2226 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
06.11.2022, 14:39
А может не угадает.

Требуется соблюдение условия
может заведомо угадать
что накладывает на результат обязательный 100%-ый шанс на успех (при выполнении "оптимальной стратегии поиска").
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.11.2022, 17:00
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
8192: log(8192)=14
1 is it less than 4097 ?
2 is it less than 6145 ?
3 is it less than 7169 ?
4 is it less than 7681 ?
5 is it less than 7937 ?
6 is it less than 8065 ?
7 is it less than 8129 ?
8 is it less than 8161 ?
9 is it less than 8177 ?
10 is it less than 8185 ?
11 is it less than 8189 ?
12 is it less than 8191 ?
13 is it less than 8192 ?
i guess it is 8192 !
Добавлено через 2 минуты
твой логарифм говорит, что число 8192 можно угадать только за 14 вопросов при N=8192

Добавлено через 42 секунды
я угадал за 13 честным бинарным поиском.
0
place status here
 Аватар для gunslinger
3190 / 2226 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
06.11.2022, 17:09
Прошу прощения, мой ответ в корне неверный. Что-то я того этого (начудил короче).
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
06.11.2022, 17:10
Программа, где я это посчитал
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int guesses(int left = 1, int right = 1001, bool debugprint=false) {
    if (left + 1 == right) {
        if (debugprint)
            cout << "i guess it is " << left + 1 << " !" << endl;
        return 0;
    }
    if (left + 2 == right) { 
        if (debugprint) {
            cout << "is it less than " << left + 1 << " ?" << endl;
            cout << "i guess it is " << left + 1 << " !" << endl;
        }
        return 1; 
    }
    int mid = (left + right) / 2;
    int results[] = { guesses(left, mid, false) , guesses(mid, right, false) };
    if (debugprint) {
        cout << "is it less than " << mid << " ?" << endl;
        if (results[0] > results[1]) {
            guesses(left, mid, true);
        } else {
            guesses(mid, right, true);
        }
    }
    return results[0] > results[1] ? results[0] + 1 : results[1] + 1;
}
int cnt = 0;
int log(int N) {
    cnt += 1;
    if (N == 1) {
        return cnt;
    }
    else {
        return log(N / 2);
    }
}
int main() {
    int max = 0, maxi=0;
    //запуск 10000 игр, в различных диапазонах
    for (int N = 1; N < 10001; ++N) {
        int val = guesses(1, N+1);
        if (val > max) {
            max = val;
            maxi = N;
        }
    }//выбор среди них самых больших результатов поиска.
    cout << "from =" << maxi << endl;
    cout <<"guesses =" <<max << endl;
    cout << "log=" << log(maxi) << endl;
    //демонстрация самой долгой игры
    guesses(1, maxi+1, true);//последний параметр true отвечает за вывод на экран вопросов в процессе игры
 
    //задача 2. сравнить мой алгоритм с твоим
    //поиск таких N для которых результат игры не равен логарифму.
    for (int N = 1; N < 10001; ++N) {
        int val = guesses(1, N + 1);
        int logval = log(N);
        if (val != logval) {
            cout << N << ": val=" << val << "; logval=" << logval << endl;
        }
        cnt = 0;
    }
    //демонстрация одной из игр, где функция log не сработала
    cout << "***demo play***" << endl;
    int N = 8192;
    guesses(1, N + 1, true);
    return 0;
}
1
place status here
 Аватар для gunslinger
3190 / 2226 / 640
Регистрация: 20.07.2013
Сообщений: 6,022
06.11.2022, 17:34
Как я понял, ответ крутится вокруг целой части выражения log2N (либо это точное решение, либо к нему нужно прибавить 1). Верно?
1
8 / 6 / 2
Регистрация: 06.11.2022
Сообщений: 5
06.11.2022, 18:11
C++
1
2
3
4
5
6
7
#include <iostream>
 
int main() {
    int n;
    std::cin >> n;
    std::cout << std::__lg(n) + 1 - ((n & (n - 1)) == 0);
}
Добавлено через 3 минуты
gunslinger, ответ равен https://www.cyberforum.ru/cgi-bin/latex.cgi?$\lceil log_2{n} \rceil$
2
0 / 0 / 0
Регистрация: 07.08.2025
Сообщений: 1
07.08.2025, 12:01
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <cmath>
 
int main() {
    int N;
    std::cin >> N;
    // minimal k, при котором 2^k >= N — это ceil(log2(N))
    int k = (N == 1) ? 0 : (int)std::ceil(std::log2(N));
    std::cout << k << std::endl;
    return 0;
}
0
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6209 / 2906 / 1044
Регистрация: 01.06.2021
Сообщений: 10,709
07.08.2025, 13:07
Цитата Сообщение от qwe77qwe Посмотреть сообщение
C++
1
std::__lg(n) + 1 - ((n & (n - 1)) == 0)
зачем так писать?
в стандартной библиотеке есть и std::ceil и std::log2

и, кстати, вот эта функция std::__lg является внутренней функцией библиотеки компилятора из GNU GCC и не является частью С++. Соответственно, твой код не будет работать с другими компиляторами.
0
 Аватар для andrey_f
884 / 537 / 228
Регистрация: 21.02.2011
Сообщений: 5,705
13.08.2025, 09:56
C++
1
2
3
4
5
6
7
8
#include <iostream>
int main() {
    int N, questions = 0;
    std::cin >> N;
    while ((1 << questions) < N) ++questions;
    std::cout << questions << std::endl;
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
13.08.2025, 17:57
Цитата Сообщение от Royal_X Посмотреть сообщение
в стандартной библиотеке есть и std::ceil и std::log2
Плавающая арифметика в целочисленной задаче - жуть.

Для того, чтобы из готового https://www.cyberforum.ru/cgi-bin/latex.cgi?$\lfloor log_2{n} \rfloor$ получить https://www.cyberforum.ru/cgi-bin/latex.cgi?$\lceil log_2{n} \rceil$ достаточно предварительно увеличить аргумент в два раза и вычесть из него единицу. Начиная с C++20 в стандартной библиотеке есть std::bit_width, который представляет собой готовый целочисленный https://www.cyberforum.ru/cgi-bin/latex.cgi?$\lfloor log_2{n} \rfloor + 1$. Так что ответ задачи для входного значения N будет равен std::bit_width(2 * N - 1) - 1

C++
1
2
3
4
5
6
7
8
9
#include <bit>
#include <iostream>
 
int main() 
{
  unsigned N = 0;
  std::cin >> N;
  std::cout << std::bit_width(2 * N - 1) - 1 << std::endl;
}
1
Эксперт функциональных языков программированияЭксперт С++
 Аватар для Royal_X
6209 / 2906 / 1044
Регистрация: 01.06.2021
Сообщений: 10,709
13.08.2025, 19:50
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
плавающая арифметика в целочисленной задаче - жуть.
я отвечал на конкретный пост, зачем цитируешь без контекста? Я не говорил, что плавающая арифметика это хорошо или плохо. Я писал, что вместо корявых функций можно использовать библиотечные.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.08.2025, 19:50
Помогаю со студенческими работами здесь

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

Рекурсивная реализация алгоритма двоичного поиска
Рекурсивная реализация алгоритма двоичного поиска

Определить количество уровней двоичного дерева поиска
Привет всем неравнодушным)! Напишите элемент-функцию depth, принимающую в качестве аргумента двоичное дерево и определяющую, сколько...

Записать алгоритм двоичного поиска элемента в массиве
Записать алгоритм двоичного поиска заданного элемента X в массиве A(1..N).

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


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru