---
# System prepended metadata

title: APCS實作題2021年11月第1題：修補圍籬
tags: [C++, APCS, Python]

---

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

