Universal Cup Judging System

Universal Cup

実行時間制限: 15.0 s メモリ制限: 2048 MB 満点: 100 難易度: [表示] インタラクティブ コミュニケーション ハック可能 ✓
統計

Это интерактивная задача. Не забывайте очищать буфер вывода (flush) после каждого вывода. Для очистки буфера вывода можно использовать:

  • fflush(stdout) или cout.flush() в C/C++;
  • System.out.flush() в Java и Kotlin;
  • sys.stdout.flush() в Python.

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
Концепция игры, проиллюстрированная Nano Banana Pro.

Вы участвуете в стратегической пошаговой игре под названием Revolver Roulette («Револьверная рулетка»).

Игра начинается с револьвера, в барабан которого заряжено ровно $6$ патронов. Каждый патрон независимо и равновероятно является либо боевым (live), либо холостым (blank). Оба игрока всегда знают текущее количество боевых и холостых патронов, оставшихся в барабане, но точный их порядок неизвестен.

Каждый игрок начинает с $5$ очками здоровья (HP) и $2$ предметами. Если здоровье игрока падает до $0$ или ниже, он выбывает, а другой игрок побеждает. Игроки совершают действия по очереди.

Порядок хода

Во время своего хода активный игрок может выполнить любое количество следующих действий:

  • Использовать любой предмет.
  • Выполнить любое действие со стрельбой.

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

Действия со стрельбой

Активный игрок должен выбрать одно из следующих действий со стрельбой:

  • Fire at Opponent: Активный игрок выстреливает следующим патроном в противника. Если патрон боевой, противник теряет $1$ HP. Независимо от типа патрона, ход переходит к противнику.
  • Fire at Self: Активный игрок выстреливает следующим патроном в себя. Если патрон боевой, активный игрок теряет $1$ HP, а ход переходит к противнику. Иначе, если патрон холостой, активный игрок сохраняет свой ход и продолжает выполнять действия.

Предметы

При использовании предмет расходуется, а активный игрок сохраняет свой ход независимо от типа предмета. Предметы видны обоим игрокам. Когда игрок получает новый предмет (включая каждый из начальных предметов), он выбирается равновероятно случайным образом из следующих четырёх типов:

  • Dummy: Выстрелить следующим патроном в тренировочный манекен. Это расходует патрон и не считается действием со стрельбой.
  • Magnifier: Подсмотреть следующий патрон, чтобы узнать, боевой он или холостой. Результат становится известен обоим игрокам.
  • Converter: Инвертировать тип следующего патрона (боевой $\leftrightarrow$ холостой). Оба игрока видят обновлённое количество боевых и холостых патронов.
  • Cage: Получить одноразовый эффект, который предотвращает завершение хода при следующем действии со стрельбой, которое обычно завершило бы ход. А именно:

    • Если игрок затем выполняет Fire at Opponent (независимо от того, боевой патрон или холостой), эффект срабатывает и ход не заканчивается.
    • Если игрок затем выполняет Fire at Self и патрон оказывается боевым, эффект срабатывает и ход не заканчивается (игрок всё равно теряет $1$ HP, но сохраняет ход).

    Эффект расходуется сразу после однократного срабатывания. За один ход можно использовать не более одного предмета Cage.

Перезарядка (Reloading)

Когда барабан пустеет, в него немедленно заряжаются $6$ новых патронов (каждый независимо является боевым или холостым с равной вероятностью). Обоим игрокам сообщается новое количество боевых и холостых патронов. Кроме того, запасы предметов каждого игрока пополняются до $2$ штук (игрок, у которого осталось $k$ предметов, получает $(2 - k)$ новых предметов, каждый из которых независимо и равновероятно выбирается из четырёх описанных выше типов).

Цель

Вы — игрок, который ходит первым, и ваша цель — выиграть партию, устранив противника.

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

Первая строка содержит два целых числа $n$ и $w$, означающих, что для прохождения теста вам необходимо выиграть хотя бы $w$ из $n$ партий. Всего в задаче только три теста:

  • Пример: $n = 1$ и $w = 0$. ($0\%$)
  • Секретный тест 1: $n = 2\,000$ и $w = 1\,000$. ($50\%$)
  • Секретный тест 2: $n = 20\,000$ и $w = 11\,000$. ($55\%$)

Можно показать, что при оптимальной игре обоих игроков первый игрок выигрывает примерно $56.89\%$ партий.

Протокол взаимодействия

Начало партии

Ваше решение играет роль первого игрока против интерактора. В начале каждой партии интерактор выводит целое число $g$:

  • Если $g = 0$, все партии текущего запуска завершены. Ваше решение должно немедленно завершить работу.
  • Иначе $g$ — номер текущей партии ($1 \le g \le n$).

По техническим причинам ваше решение запускается дважды на каждом тесте:

  • Интерактор может в любой момент решить перезапустить ваше решение, передав $g = 0$.

В каждом запуске в рамках одного теста вы получите одни и те же значения $n$ и $w$. Поэтому $n$ не всегда равно количеству партий в текущем запуске. Гарантируется, что каждая партия $1, \dots, n$ будет сыграна ровно один раз суммарно за два запуска. В остальном ваше решение может смело игнорировать условие двойного запуска.

Состояние игры

Затем интерактор выводит строку состояния игры, содержащую $13$ неотрицательных целых чисел:

$$t \quad l \quad b \quad h_1 \quad d_1 \quad m_1 \quad c_1 \quad k_1 \quad h_2 \quad d_2 \quad m_2 \quad c_2 \quad k_2$$

  • $t \in \{0, 1, 2\}$: статус хода.
  • $l, b$ ($1 \le l + b \le 6$): текущее количество боевых и холостых патронов, оставшихся в барабане.
  • $h_1$ ($0 \le h_1 \le 5$): ваше текущее здоровье (HP).
  • $d_1, m_1, c_1, k_1$ ($0 \le d_1 + m_1 + c_1 + k_1 \le 2$): количество предметов Dummy, Magnifier, Converter и Cage, имеющихся у вас в данный момент.
  • $h_2$ ($0 \le h_2 \le 5$): текущее здоровье (HP) вашего противника.
  • $d_2, m_2, c_2, k_2$ ($0 \le d_2 + m_2 + c_2 + k_2 \le 2$): количество предметов Dummy, Magnifier, Converter и Cage, имеющихся у вашего противника.

Случай $t = 0$ (Партия окончена)

Текущая партия завершена. Интерактор переходит к следующей партии (выводя новое значение $g$).

Случай $t = 1$ (Ваш ход)

Вы должны вывести одно целое число для выбора действия:

  1. Fire at Opponent.
  2. Fire at Self.
  3. Использовать предмет Dummy.
  4. Использовать предмет Magnifier.
  5. Использовать предмет Converter.
  6. Использовать предмет Cage.

Если действие недопустимо (например, попытка использовать предмет, которого у вас нет, или использовать предмет Cage более одного раза за один ход), состояние игры не меняется, а интерактор выводит $0$ и снова ту же строку состояния ($13$ целых чисел). Ход остаётся за вами, но для продолжения игры вы должны сделать другое корректное действие.

В противном случае действие выполняется, и интерактор выводит целое число — результат:

  • Для действий $1$–$5$: Возвращает $1$, если следующий патрон перед действием был боевым, и $2$, если холостым.
  • Для действия $6$: Возвращает $1$ (информация о патроне не раскрывается).

Затем интерактор выводит обновлённую строку состояния игры.

Случай $t = 2$ (Ход противника)

Интерактор симулирует действие вашего противника и выводит две строки:

  • Номер действия $a \in \{1, \dots, 6\}$.
  • Число-результат ($1$ или $2$, как описано выше).

Ваш противник никогда не совершает недопустимых действий. Сразу после этого интерактор выводит следующую строку состояния игры ($13$ целых чисел).

В каждом раунде игры симулятор использует генератор псевдослучайных чисел с фиксированным начальным значением (seed). Кроме того, противник в интеракторе использует детерминированную стратегию. Решение о перезапуске вашего решения не зависит от процесса взаимодействия. Следовательно, одна и та же последовательность действий всегда приводит к одному и тому же состоянию игры.

Для помощи в разработке и тестировании вашего решения предоставляется инструмент тестирования.

Пример

Пример 1, Запуск 1

Входные данные
1 0
1
1 3 3 5 0 0 0 2 5 1 0 1 0

1
1 3 3 5 0 0 0 1 5 1 0 1 0

1
1 2 3 5 0 0 0 1 4 1 0 1 0

0
1 2 3 5 0 0 0 1 4 1 0 1 0

2
1 2 2 5 0 0 0 1 4 1 0 1 0

1
2 1 2 5 0 0 0 1 3 1 0 1 0
5
2
2 2 1 5 0 0 0 1 3 1 0 0 0
1
1
1 1 1 4 0 0 0 1 3 1 0 0 0

1
2 0 1 4 0 0 0 1 2 1 0 0 0
3
2
2 2 4 4 0 1 0 1 2 0 1 0 1
2
1
1 1 4 4 0 1 0 1 1 0 1 0 1

1
1 1 4 4 0 0 0 1 1 0 1 0 1

1
0 0 4 4 0 0 0 1 0 0 1 0 1
0
Выходные данные


6


1


6


2


1








1








4


1

Пример 1, Запуск 2

Входные данные
1 0
0
Выходные данные
		

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.