QOJ.ac

QOJ

Time Limit: 4 s Memory Limit: 4096 MB Total points: 100 Difficulty: [show] Interactive

#13650. Скучная игра

Statistics

Алиса и её младший брат Боб играют в игру на угадывание чисел.

Боб загадал (скрытое) целое число $S$.

Алиса может задавать вопросы о скрытом числе следующего вида: «Является ли скрытое число не меньше $x$?» Боб отвечает на её вопросы «Да» или «Нет». К сожалению, после $K \ge 1$ вопросов Боб устаёт от игры, и с этого момента он будет давать ложные ответы на все вопросы.

То есть Боб: Отвечает «Да» на первые $K$ вопросов тогда и только тогда, когда $x \le S$. После $K$-го вопроса он отвечает «Да» тогда и только тогда, когда $S < x$.

Заметьте, что Боб всегда отвечает правильно на первый вопрос, и Алиса не знает значения $K$.

Ваша задача — разработать и реализовать стратегию опроса для Алисы, чтобы определить скрытое число. Ваш балл зависит от количества заданных вопросов — чем меньше вопросов, тем выше балл.

Детали реализации

Вы должны реализовать следующую процедуру:

long long play_game()
  • Эта процедура вызывается не более $T$ раз для каждого теста.

Процедура должна найти и вернуть скрытое число $S$, вызывая следующую процедуру для задания вопросов о скрытом числе:

bool ask(long long x)
  • $x$: число, задающее вопрос Алисы.
  • Значение $x$ должно быть в диапазоне от $1$ до $10^{18}$ включительно.
  • Процедура возвращает логическое значение, представляющее ответ Боба.
  • Процедура может быть вызвана не более $150$ раз в каждом вызове play_game.

Поведение проверяющей системы является адаптивным, что означает, что в некоторых тестах значения $S$ и $K$ не зафиксированы до вызова play_game. Гарантируется, что существует по крайней мере одна пара $(S, K)$, для которой ответы проверяющей системы согласованы.

Ограничения

  • $1 \le T \le 1000$
  • $1 \le S \le 10^{18}$
  • $1 \le K \le 150$

Подзадачи

Если ваше решение не соответствует описанным выше деталям реализации или если значение, возвращаемое play_game, неверно даже для одного вызова, ваше решение получит 0 баллов.

В противном случае, пусть $C$ — максимальное количество вопросов, которое задает ваше решение во всех вызовах play_game. Ваш балл рассчитывается согласно следующей таблице:

Условие Баллы
$132 < C \le 150$ $20 \cdot (\frac{150-C}{18})^2$
$78 < C \le 132$ $20 + 20 \cdot (\frac{132-C}{54})^2$
$72 < C \le 78$ $40 + 30 \cdot (\frac{78-C}{6})^2$
$67 < C \le 72$ $70 + 30 \cdot (\frac{72-C}{5})^2$
$C \le 67$ $100$

Примеры

Рассмотрим сценарий, где скрытое целое число $S = 2$, а $K = 1$. Игра начинается с вызова:

play_game()

Предположим, что play_game сначала вызывает ask(2). Так как $2 \le S = 2$ и Боб в этот момент говорит правду, вызов возвращает true.

Предположим, play_game снова вызывает ask(2). Хотя условие $2 \le S = 2$ всё ещё выполняется, Боб теперь лжёт (так как он уже сказал правду $K = 1$ раз), поэтому вызов возвращает false. Получение противоречивых ответов на один и тот же вопрос показывает, что Боб будет лгать на все последующие вопросы.

Теперь предположим, что play_game вызывает ask(3). Так как $3 \le S = 2$ ложно, а Боб лжёт, вызов возвращает true. В этот момент мы можем сделать вывод, что $2 \le S < 3$, что означает $S = 2$.

Следовательно, процедура должна вернуть $2$.

Примечание

Проверяющая система в примере не является адаптивной. Она обрабатывает $T$ сценариев, и в каждом случае считывает фиксированные значения $S$ и $K$ из входных данных и отвечает на вопросы соответствующим образом.

Входные данные:

T
S[0] K[0]
S[1] K[1]
...
S[T-1] K[T-1]

Здесь $S[i]$ и $K[i]$ ($0 \le i < T$) задают скрытые параметры для каждого вызова play_game.

Выходные данные:

G[0] C[0]
G[1] C[1]
...
G[T-1] C[T-1]

Здесь $G[i]$ ($0 \le i < T$) — это число, возвращенное play_game, когда скрытые параметры равны $S[i]$ и $K[i]$, а $C[i]$ — это количество вопросов, заданных во время этого вызова.

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.