# APCS實作題2021年11月第1題:修補圍籬
> 日期:2023年9月17日
> 作者:王一哲
> 題目來源:110年11月實作題第1題
> [ZeroJudge 題目連結](https://zerojudge.tw/ShowProblem?problemid=g595)
<br />
## 題目
### 問題描述
有一個農場有寬度為 $n$ 的圍籬, 每個圍籬都有各自的高度 $h[1], h[2], \dots, h[n]$。
有些圍籬被吹斷了,農場主人要來修補這些圍籬,但他忘記這些壞掉的圍籬原本高度是多少,為了減少成本,他會取斷掉的圍籬位置相鄰左邊和右邊較小的那個高度填上去,問需要多少成本。
題目保證不會有兩個相鄰的吹斷圍籬,而穿斷的圍籬有可能位在邊界。
<br />
### 輸入說明
輸入包含兩行
- 第一行有一個正整數 $n$
- 第二行有 $n$ 個以空隔分隔的整數 $h[1], h[2], \dots, h[n]$
數字範圍
- $3 \leq n \leq 100$
- $0 \leq h[n] \leq 100$
子題配分
- 60%:$n = 3$
- 40%:無額外限制
<br />
### 輸出說明
輸出一個正整數表示新增的圍籬長度總和
<br />
### 範例一:輸入
```
3
2 0 4
```
### 範例一:正確輸出
```
2
```
<br />
### 範例二:輸入
```
9
0 5 3 0 6 4 0 1 0
```
### 範例二:正確輸出
```
10
```
<br />
## Python 程式碼
於 ZeroJudge 測試結果,最長運算時間約為 20 ms,使用記憶體最多約為 3.3 MB,通過測試。
```python=
n = int(input()) # 讀取圍籬數量n
h = list(map(int, input().split())) # 讀取圍籬高度h
ans = 0 # 要修補的圍籬高度
for i in range(n): # 依序檢查每一片圍籬
if h[i] == 0: # 如果圍籬高度為0
if i == 0: ans += h[i+1] # 如果是第0片,取第1片的高度補上
elif i == n-1: ans += h[i-1] # 如果是第n-1片,取第n-2片的高度補上
else: ans += min(h[i-1], h[i+1]) # 中間的圍籬,取兩側圍籬較低的高度補上
print(ans) # 印出答案
```
<br /><br />
## C++ 程式碼
用 Python 程式碼版本1改寫成 C++ 程式碼,於 ZeroJudge 測試結果,最長運算時間約為 3 ms,使用記憶體最多約為 336 kB,通過測試。
```cpp=
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
int n; cin >> n; // 讀取圍籬數量n
int h[n];
for(int i=0; i<n; i++) cin >> h[i]; // 讀取圍籬高度h
int ans = 0; // 要修補的圍籬高度
for(int i=0; i<n; i++) { // 依序檢查每一片圍籬
if (h[i] == 0) { // 如果圍籬高度為0
if (i == 0) ans += h[i+1]; // 如果是第0片,取第1片的高度補上
else if (i == n-1) ans += h[i-1]; // 如果是第n-1片,取第n-2片的高度補上
else ans += min(h[i-1], h[i+1]); // 中間的圍籬,取兩側圍籬較低的高度補上
}
}
cout << ans << endl; // 印出答案
return 0;
}
```
<br /><br />
---
###### tags:`APCS`、`Python`、`C++`