Условие
Загадано целое число от до включительно. Разрешено задавать вопросы, на которые отвечают только «да» или «нет». Как гарантированно определить число не более чем за вопросов?
О задаче · 6–9 классы
Записать идеюЕсть запись
Личный черновик для заметок и расчётов. Он никуда не отправляется и не проверяется.
Черновик не сохраняется: текст только в этой вкладке.
Черновик изменён в другой вкладке. Твой текущий текст пока сохранён здесь, автоматическая запись остановлена.
Подсказка 1
Первый вопрос: число не больше пятидесяти?
Подсказка 2
Каждый раз делите оставшийся диапазон на две части, различающиеся не более чем на один вариант.
Разобрать решение по шагам
Первое деление
Ответ на «число не больше ?» оставляет вариантов: от до либо от до .
Повторим тот же выбор
Делим текущий диапазон как можно поровну и спрашиваем про нижнюю половину. В худшем случае числа кандидатов таковы:
Это семь вопросов.
Почему шести недостаточно
Шесть ответов «да/нет» имеют не более разных последовательностей. Чтобы отличить чисел, каждому нужен отдельный результат. Значит, гарантированно уложиться в шесть нельзя.
Ответ
вопросов достаточно; не гарантируют ответ.
Главная идея
Двоичный поиск на каждом шаге уменьшает число кандидатов примерно вдвое. Чтобы он работал, вопрос должен надёжно определять нужную половину.
Как заметить эту идею в другой задаче
Есть упорядоченные варианты и надёжные вопросы про половину диапазона. Деление пополам даёт короткую стратегию даже в худшем случае.
Возможная ошибка
Оценивать стратегию только по удачному случаю. Гарантированное число вопросов определяется самым длинным возможным путём.
Источник и примечания
Источник и редакция
Учебный разбор Popov Academy · Алгоритмы и двоичный поиск. Не вариант конкретной олимпиады или экзамена.
Проверь себя
Сколько вопросов «да/нет» необходимо и достаточно, чтобы гарантированно определить число от до ?
Ответ к дополнительной задаче
вопросов: . Девяти недостаточно, а последовательное деление пополам даёт десять.
Тема, знания и приёмы
Поиск и алгоритмы · Начальный вход
- Деление диапазона пополам. Код писать не потребуется.
Приёмы решения: Разделение пространства поиска