【APCS】2024年6月實作題 C++ 解題筆記(前兩題) === 此筆記僅供個人學習用途,內容僅供參考。 1. https://zerojudge.tw/ShowProblem?problemid=o076 題目說明: $n$ 棟高樓,樓高為 $h_n$ ,會從某棟高樓上向右滑翔,要找到一組遞減序列,使序列長度達最長。 解題思路: 1. 開一個 vector h,並多一個元素,做邊界檢查。 2. 令這個邊界是 h 的上限最大值+1(題目的 h 是 $1 \leq h \leq 1000$ ),所以 `h[n] = 1001`。 3. 設兩個變數 `maxLen` 紀錄序列最大長度,`len` 紀錄目前長度。 4. 迴圈+判斷 `h[i] > h[i+1]`,達成條件就 `len++`,否則更新最大長度 `maxLen = max(maxLen, len + 1)`,並重置 `len = 0`。 ```cpp= #include <iostream> #include <vector> using namespace std; int main(){ int n; cin >> n; vector <int> h(n + 1); h[n] = 1001; int maxLen = 0, len = 0; for (int i = 0; i < n; i++){ cin >> h[i]; } for (int i = 0; i < n; i++){ if (h[i] > h[i + 1]){ len ++; } else{ maxLen = max(maxLen, len + 1); len = 0; } } cout << maxLen; return 0; } ``` 2. https://zerojudge.tw/ShowProblem?problemid=o077 題目說明: - 畫布為 $H \times W$,初始為 $0$。 - 每次操作定義為: - 起點 $(r, c)$ 。 - 停留時間 $t$:會影響曼哈頓距離 $\leq t$ 的所有點。 - 顏色值 $x$:將影響區塊累加顏色值。 **曼哈頓距離**: 對任意兩點 $(x_1, y_1)$ 和 $(x_2, y_2)$,曼哈頓距離為 $|x_1 - x_2| + |y_1 - y_2|$ 。 解題思路: 1. 初始化一個二維 vector `canvas[H][W]` 為 $0$ 。 2. 對於每次操作 $(r, c, t, x)$ : - 遍歷整個畫布的每個座標 $(i, j)$ - 計算曼哈頓距離:$|i - r| + |j - c|$ - 若距離 $\leq t$,則將 `canvas[i][j] += x`。 這題可以用 BFS 優化,但畢竟還是第二題,大概 APCS 也不想要這麼狠心,所以這測資範圍直接暴力解是可 AC 的。 ```cpp= #include <iostream> #include <vector> #include <cmath> using namespace std; int main() { int H, W, N; cin >> H >> W >> N; vector<vector<int>> canvas(H, vector<int>(W, 0)); for (int i = 0; i < N; ++i) { int r, c, t, x; cin >> r >> c >> t >> x; // 讀入本次操作的座標 (r, c)、停留時間 t、顏色值 x // 遍歷畫布上的所有位置 for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { // 計算此位置與操作點的曼哈頓距離 int d = abs(i - r) + abs(j - c); // 若距離 <= t,代表這格會被影響,加上顏色值 x if (d <= t) { canvas[i][j] += x; } } } } for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { cout << canvas[i][j]; if (j < W - 1) cout << " "; } cout << "\n"; } return 0; } ```