# APCS實作題2025年1月第1題:等紅綠燈
> 日期:2025年1月14日
> 作者:王一哲
> [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=q181)
## 題目
### 問題描述
操場起跑線上有一個紅綠燈,綠燈為 $a$ 秒,紅燈為 $b$ 秒,依照綠燈紅燈的順序循環。有 $n$ 個小朋友,從操場的起跑線騎腳踏車一起起跑,他們分別騎完一圈的時間為 $t_1, t_2, t_3, \dots, t_n$。若騎到終點時為紅燈,需要等待紅燈結束變為綠燈才可以停止騎車。求出這 $n$ 個小朋友共需要等待幾秒的紅燈秒數。
**註:騎到終點時如果紅燈剛好開始,就要再騎 $b$ 秒。**
<br />
### 輸入說明
第一行輸入兩個正整數 $a, b ~(1 \leq a, b \leq 100)$,接下來一行有一個正整數 $n ~(1 \leq n \leq 30)$,最後一行有 $n$ 個正整數數字,數字不超過 $1000$。
子題配分
- 60%:$a = b = 10, n = 1$
- 40%:無限制
<br />
### 輸出格式
輸出這 $n$ 個小朋友共需要等待多久的紅燈秒數。
<br />
### 範例輸入1
```
10 10
1
14
```
### 範例輸出1
```
6
```
### 範例輸入2
```
4 3
3
12 16 25
```
### 範例輸出2
```
5
```
<br /><br />
## Python 程式碼
費時最久約為 28 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
a, b = map(int, input().split()) # 綠燈、紅燈秒數
c = a+b # 綠燈、紅燈循環一次的秒數
n = int(input()) # n 個人
ts = list(map(int, input().split())) # 每個人騎一圈需要的秒數
ans = 0 # 等紅燈秒數
for t in ts: # 依序讀取每個人騎一圈需要的秒數
r = t%c # 剩下的秒數
if r >= a: ans += c-r # 遇到紅燈,ans 加上剩下的紅燈秒數
print(ans) # 印出答案
```
<br /><br />
## C++ 程式碼
費時最久約為 3 ms,使用記憶體最多約為 348 kB,通過測試。
```cpp=
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
int a, b; cin >> a >> b; // 綠燈、紅燈秒數
int c = a+b, n, ans = 0; // 綠燈、紅燈循環一次的秒數 c,n 個人,等紅燈秒數
cin >> n; // 讀取人數
for(int i=0, t, r; i<n; i++) { // 依序讀取每個人騎一圈需要的秒數 t
cin >> t; r = t%c; // 剩下的秒數
if (r >= a) ans += c-r; // 遇到紅燈,ans 加上剩下的紅燈秒數
}
cout << ans << "\n"; // 印出答案
return 0;
}
```
<br /><br />
---
###### tags:`APCS`、`Python`、`C++`