熱門文章

2025年4月7日 星期一

ZeroJudge 解題筆記:i071. 風景 (Landscape)

作者:王一哲
日期:2025年4月7日



ZeroJudge 題目連結:i071. 風景 (Landscape)

解題想法


從起點開始向左、向右線性搜尋各一次即可。

Python 程式碼


使用時間約為 19 ms,記憶體約為 3.4 MB,通過測試。
import sys

for line in sys.stdin:
    n, m = map(int, line.split())  # n 棟建築,人在第 m 棟,編號從 1 開始
    hs = list(map(int, input().split()))  # 所有建築物的高度
    tot = 0  # 能看到的建築物數量
    m -= 1  # 建築物編號改成從 0 開始
    pre = hs[m]  # 前一棟最高建築物的高度,預設為自己所在的建築物高度
    for i in range(m, 0, -1):  # 從 m 開始向左找
        if hs[i-1] > pre:  # 如果左邊的建築物高度大於 pre
            tot += 1  # tot 加 1
            pre = hs[i-1]  # 更新 pre
    pre = hs[m]  # 重設 pre
    for i in range(m, n-1):  # 從 m 開始向右找
        if hs[i+1] > pre:  # 如果右邊的建築物高度大於 pre
            tot += 1  # tot 加 1
            pre = hs[i+1]  # 更新 pre
    print(tot)  # 印出答案


C++ 程式碼


使用時間約為 2 ms,記憶體約為 96 kB,通過測試。
#include 
using namespace std;

int main() {
    int n, m;  // n 棟建築,人在第 m 棟,編號從 1 開始
    while(scanf("%d %d", &n, &m) != EOF) {
        int hs[n];  // 所有建築物的高度
        for(int i=0; i0; i--) {  // 從 m 開始向左找
            if (hs[i-1] > pre) {  // 如果左邊的建築物高度大於 pre
                tot++;  // tot 加 1
                pre = hs[i-1];  // 更新 pre
            }
        }
        pre = hs[m];  // 重設 pre
        for(int i=m; i pre) {  // 如果右邊的建築物高度大於 pre
                tot++;  // tot 加 1
                pre = hs[i+1];  // 更新 pre
            }
        }
        printf("%d\n", tot);
    }
    return 0;
}


沒有留言:

張貼留言