# 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`