# 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++`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.