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.