Universal Cup Judging System

Universal Cup

시간 제한: 15.0 s 메모리 제한: 2048 MB 총점: 100 난이도: [표시] 인터랙티브 커뮤니케이션 해킹 가능 ✓
통계

これはインタラクティブ問題です。出力のたびに出力バッファをフラッシュすることを忘れないでください。出力をフラッシュするには、以下を使用できます:

  • C/C++ では fflush(stdout) または cout.flush();
  • Java および Kotlin では System.out.flush();
  • Python では sys.stdout.flush()。

problem_16334_77704ec8666e21115ab8bd1ebbcde701.png
Nano Banana Pro によるゲームのコンセプトイラスト。

あなたは『リボルバー・ルーレット(Revolver Roulette)』という戦略的ターン制ゲームに参加しています。

ゲームはちょうど $6$ 発の弾丸が装填されたリボルバーから始まります。各弾丸は独立に等確率で実包(live)または空包(blank)のいずれかです。両プレイヤーは常にシリンダー内に残っている実包と空包の現在の個数を知っていますが、その正確な順序は分かりません。

各プレイヤーは初期状態で体力(HP)$5$ とアイテム $2$ 個を持っています。プレイヤーの HP が $0$ 以下になると脱落し、もう一方のプレイヤーの勝利となります。プレイヤーは交互に手番を行い、アクションを実行します。

ターンの手順

自分のターン中、手番プレイヤーは以下のアクションを任意の回数実行できます:

  • 任意のアイテムを使用する。
  • 任意の射撃アクションを実行する。

射撃アクションによってターンが相手プレイヤーに移るか、いずれかのプレイヤーが脱落したときにのみターンが終了します。

射撃アクション

手番プレイヤーは以下の射撃アクションから $1$ つを選ばなければなりません:

  • Fire at Opponent:手番プレイヤーは次の弾丸を相手プレイヤーに向けて撃つ。実包であれば、相手プレイヤーは $1$ HP を失う。弾丸の種類にかかわらず、ターンは相手プレイヤーに移る。
  • Fire at Self:手番プレイヤーは次の弾丸を自分自身に向けて撃つ。実包であれば、手番プレイヤーは $1$ HP を失い、ターンは相手プレイヤーに移る。そうでなく空包であれば、手番プレイヤーはターンを維持し、引き続きアクションを実行できる。

アイテム

アイテムを使用するとそのアイテムは消費され、アイテムの種類にかかわらず手番プレイヤーはターンを維持します。アイテムは両プレイヤーから見えています。プレイヤーが新しいアイテム(初期アイテムの各々を含む)を獲得するとき、以下の $4$ 種類から一様ランダムに選ばれます:

  • Dummy:訓練用ダミーに向けて次の弾丸を撃つ。これにより弾丸は消費されるが、射撃アクションとはみなされない。
  • Magnifier:次の弾丸を覗き見して、次の弾丸が実包か空包かを明らかにする。両プレイヤーがそのを知る。
  • Converter:次の弾丸の種類を反転させる(実包 $\leftrightarrow$ 空包)。両プレイヤーは更新された実包と空包の個数を確認できる。
  • Cage:通常であればターンが終了する次の射撃アクションでターンが終了するのを防ぐ、$1$ 回限りの効果を得る。具体的には:

    • プレイヤーがその後 Fire at Opponent を実行した場合(弾丸が実包か空包かにかかわらず)、効果が適用されターンは終了しない。
    • プレイヤーがその後 Fire at Self を実行し、かつ弾丸が実包だった場合、効果が適用されターンは終了しない(プレイヤーは $1$ HP を失うが、ターンを維持する)。

    この効果は $1$ 回適用されると直ちに消費される。$1$ ターンにつき使用できる Cage アイテムは高々 $1$ 個までである。

リロード(Reloading)

シリンダーが空になると、直ちに $6$ 発の新しい弾丸が装填されます(それぞれ独立に等確率で実包または空包)。両プレイヤーに新しい実包と空包の個数が知らされます。さらに、各プレイヤーはアイテムが最大 $2$ 個になるまで補充されます(アイテムを $k$ 個持っているプレイヤーは $(2 - k)$ 個の新しいアイテムを受け取り、それぞれ上記の $4$ 種類から独立に一様ランダムに選ばれます)。

目的

あなたは先手プレイヤーであり、目的は相手を脱落させてゲームに勝利することです。

入力

$1$ 行目には $2$ つの整数 $n$ と $w$ が与えられ、AC を得るには $n$ 回のゲームのうち少なくとも $w$ 回勝利する必要があることを表します。テストケースは以下の $3$ つのみです:

  • サンプルテスト:$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$)です。

技術的な理由により、あなたのプログラムは各テストで$2$ 回実行されます:

  • インタラクタは任意のタイミングで $g = 0$ を与えることで、あなたのプログラムを再起動するかどうかを決定できます。

同一テスト内の各実行では同じ $n$ と $w$ を受け取ります。したがって、$n$ は現在の実行におけるゲーム数と常に等しいとは限りません。各ゲーム $1, \dots, n$ は $2$ 回の実行を通じてちょうど $1$ 回ずつプレイされることが保証されます。この点以外に、あなたのプログラムは $2$ 回実行されるという条件を無視して構いません。

ゲーム状態

次に、インタラクタは $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$ つ出力しなければなりません:

  1. Fire at Opponent。
  2. Fire at Self。
  3. Dummy アイテムを使用する。
  4. Magnifier アイテムを使用する。
  5. Converter アイテムを使用する。
  6. Cage アイテムを使用する。

アクションが無効である場合(持っていないアイテムを使用する、同じターン内に Cage アイテムを $2$ 回以上使用するなど)、ゲーム状態は変化せず、インタラクタは $0$ と同じ状態行($13$ 個の整数)を再度出力します。引き続きあなたのターンですが、ゲームを進めるには別の有効なアクションを行わなければなりません。

そうでない場合、アクションは有効であり、インタラクタは結果を表す整数を出力します:

  • アクション $1$–$5$ の場合:アクション前の次の弾丸が実包であれば $1$、空包であれば $2$ を返す。
  • アクション $6$ の場合:$1$ を返す(弾丸の情報は明かされない)。

その後、インタラクタは更新されたゲーム状態行を出力します。

ケース $t = 2$(相手のターン)

インタラクタは相手のアクションをシミュレートし、$2$ 行を出力します:

  • アクション ID $a \in \{1, \dots, 6\}$。
  • 結果の整数(上記と同様の $1$ または $2$)。

相手が不正なアクションを行うことはありません。その直後に、インタラクタは次のゲーム状態行($13$ 個の整数)を出力します。

ゲームの各ラウンドについて、ゲームシミュレータは固定された乱数シードを持つ擬似乱数生成器を使用します。また、インタラクタ内の相手は決定論的な戦略を用います。プログラムを再起動するかどうかの決定はインタラクションの手順とは独立です。したがって、同じアクションの列は常に同じゲーム状態に到達します。

ソリューションの開発とテストを支援するためのテストツールが提供されています。

入出力例

サンプル 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.