Login with GitHub. Nope?
修正 C++ 的程式碼在使用一定量動態記憶體後會產生 RF 的問題 @ 2019/12/6 4:45pm NeoHOJ 強勢復活中 (Open beta)
Submit  Ranklist

Problem : 257 - [Interactive]Bidding

Problem Statistics

Solved Member: 13  Submission: 121  User Tried: 13

Statement:

請在程式碼加入#include "interactive/257.h"回答問題。

Alois 和 Byteasar 正在玩一個投標遊戲,他們試著用石頭來競標。這兩個玩家可以依序動作, Alois 最先,接著換 Byteasar 然後再換 Alois ,以此類推。每一次動作可以影響到 pot 或 stack 兩個地方的石頭數量。剛開始 pot 裡有一顆石頭,stack裡面沒有石頭。每個玩家可以做以下三種動作:

  • 將 pot 裡的石頭變成兩倍
  • 將 pot 裡的石頭變成三倍
  • 略過

當一個玩家略過此步驟,目前在 pot 裡的石頭都會移到stack中 (這是使 stack 石頭數量增加的唯一方法),並且 pot 中的石頭數量恢復為 1。若某個人使得 stack 中的石頭數目大於等於 就是輸家。另外若輪到某人時石頭總數大於等於 則該次移動只能pass,必定輸。

Alois 常常輸給Byteasar 寫的程式,因此他決定請你來幫忙寫個程式擊敗 Byteasar。

Task:

函式庫中將提供以下的函式

 • Init – 回傳數字 n。你必須要在程式一開始呼叫這個函式。
  o C/C++: int Init();
 • Alois – 回傳你要做的動作 x,若 x=1 代表略過,x=2 代表將 pot 石頭變成兩倍, x=3 代表將石頭數變成三倍。
  o C/C++: void Alois(int x);
 • Byteasar – 回傳一個數字,代表電腦所做的動作。 x=1 代表略過, x=2 為將 pot 石頭變成兩倍, x=3 代表變成3倍。
  o C/C++: int Byteasar();

在呼叫 Init 程式以後,你必須輪流呼叫 Alois 以及 Byteasar 函式。當有任何一個人輸的時候將自動結束程式。注意禁止使用標準輸入以及輸出。


在所有的測試資料中都保證有必勝的方案。若你的程式贏得勝利,才會得到該題的分數。

在所有的測試資料中滿足,1 ≤ n ≤ 30000。並且至少 50% 的測是資料滿足 n ≤ 50。

Input:Output:

No Input.
No Output.

HINT:

範例:
C/C++回傳值stackpot解釋
n = Init();1501n=15
Alois(2);-02你將Pot * 2
Byteasar();204程式將 pot 變成2倍
Alois(3);-012你將 pot 變成 3 倍
Byteasar();1121程式將 12 個石頭移到stack,pot只剩1顆石頭
Alois(2);-122你將 pot * 2
Byteasar();3126程式將 pot 變成3倍
Alois(1); -181Pot以及stack的石頭總數超過 15。你將pot的石頭移到stack


上述的範例中每個步驟是對的,但是你輸了,因此不會得到任何分數。

當 n=15 的時候Alois 有方法可以贏過 Byteasar。

Source:

POI 19 Stage 3

Problem Setter

Testdata:

TestTimeMemoryScore
01000ms131072kb
1-ocen1000ms131072kb
13000ms131072kb5
2-ocen1000ms131072kb
23000ms131072kb5
3-ocen5000ms131072kb
33000ms131072kb5
43000ms131072kb5
53000ms131072kb5
63000ms131072kb5
73000ms131072kb5
83000ms131072kb5
93000ms131072kb5
103000ms131072kb5
113000ms131072kb5
123000ms131072kb5
133000ms131072kb5
143000ms131072kb5
153000ms131072kb5
163000ms131072kb5
173000ms131072kb5
183000ms131072kb5
193000ms131072kb5
203000ms131072kb5