Universal Cup Judging System

Universal Cup

Time Limit: 15.0 s Memory Limit: 2048 MB Total points: 100 Difficulty: [show] Interactive Communication Hackable ✓
Statistics

呢題係一道交互題。記得喺每次輸出之後刷新輸出緩衝區。你可以使用以下方式刷新輸出:

  • 喺 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)。雙方玩家永遠知道轉輪入面當前淨低嘅實彈同空包彈數量,但唔知道佢哋嘅具體排列順序。

每位玩家一開始有 $5$ 點生命值(HP)同埋 $2$ 件道具。如果一位玩家嘅 HP 跌到 $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$,表示你需要喺 $n$ 局遊戲入面至少贏 $w$ 局先可以獲得通過。本題只有三個測試點:

  • 範例測試點:$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$ 個整數)。

喺每局遊戲嘅每一輪入面,遊戲模擬器都會使用固定隨機種子嘅偽隨機數生成器。同時,交互器入面嘅對手採用確定性策略。重啟你程序嘅決定獨立於交互過程。因此,相同嘅行動序列永遠會導致相同嘅遊戲狀態。

題目提供咗測試工具,以協助你開發同測試你嘅程序。

範例

範例 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.