# APCS實作題2025年6月第1題:小心陷阱 > 日期:2025年6月26日 > 作者:王一哲 > [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=q836) <br /> ## 題目 ### 問題描述 在一維數線上進行一場模擬遊戲。遊戲規則如下: 1. 初始位置為 $0$。 2. 初始生命值為 $k (1 \leq k \leq 20)$。 3. 當前生命值為 $v$ 時,角色會往右跳 $v$ 格,也就是從位置 $p$ 移動到 $p + v$。 4. 每次移動後,如果落在 $x_1$ 或 $x_2$ 的倍數上,會損失生命值: 1. 若落在 $x_1$ 的倍數,生命值減少 $y_1$。 2. 若落在 $x_2$ 的倍數,生命值減少 $y_2$。 3. 若同時是 $x_1$ 和 $x_2$ 的倍數,生命值總共減少 $y_1 + y_2$。 4. 當生命值小於等於 $0$ 時,遊戲結束,輸出當前所在的位置。 <br /> ### 輸入格式 輸入第一行 $k$ 表示初始生命值 第二行有 $x_1$ 與 $y_1$ 第三行有 $x_2$ 與 $y_2$ 輸入範圍 - $k$:初始生命值,$1 \leq k \leq 20$ - $x_1$、$x_2$:兩個陷阱的倍數條件,$1 \leq x_1, x_2 \leq 10$ - $y_1$、$y_2$:對應陷阱的扣血值,$1 \leq y1, y2 \leq 20$ 子題配分 - 40%:$x_1 = 3, x_2 = 4, y_1 = y_2 = k$ - 60%:無額外限制 <br /> ### 輸出格式 輸出遊戲結束所在的位置 <br /> ### 範例一:輸入 ``` 1 3 1 4 1 ``` ### 範例一:正確輸出 ``` 3 ``` ### 範例二:輸入 ``` 7 3 2 2 3 ``` ### 範例一:正確輸出 ``` 18 ``` <br /><br /> ## Python 程式碼 使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。 ```python= k = int(input()) # 初始生命值 x1, y1 = map(int, input().split()) # 陷阱位置和扣掉的生命值 x2, y2 = map(int, input().split()) p = 0 # 位置,初始值為 0 while k > 0: # 如果 k 大於 0 繼續執行 p += k # 移動等於生命值的格數 if p%x1 == 0 and p%x2 == 0: # 如果此格同時是 x1, x2 的倍數 k -= y1 + y2 # 生命值減 (y1 + y2) elif p%x1 == 0: # 如果此格是 x1 的倍數 k -= y1 # 生命值減 y1 elif p%x2 == 0: # 如果此格是 x2 的倍數 k -= y2 # 生命值減 y2 print(p) # 印出位置 ``` <br /><br /> ## C++ 程式碼 使用時間約為 2 ms,記憶體約為 92 kB,通過測試。 ```cpp= #include <cstdio> using namespace std; int main() { int k, x1, y1, x2, y2, p = 0; // 初始生命值,陷阱位置和扣掉的生命值,現在的位置 scanf("%d\n%d %d\n%d %d", &k, &x1, &y1, &x2, &y2); while(k > 0) { // 如果 k 大於 0 繼續執行 p += k; // 移動等於生命值的格數 if (p%x1 == 0 && p%x2 == 0) { // 如果此格同時是 x1, x2 的倍數 k -= y1 + y2; // 生命值減 (y1 + y2) } else if (p%x1 == 0) { // 如果此格是 x1 的倍數 k -= y1; // 生命值減 y1 } else if (p%x2 == 0) { // 如果此格是 x2 的倍數 k -= y2; // 生命值減 y2 } } printf("%d\n", p); // 印出位置 return 0; } ``` <br /><br /> --- ###### tags:`APCS`、`C++`、`Python`