【APCS】2024年6月實作題 C++ 解題筆記(前兩題)
此筆記僅供個人學習用途,內容僅供參考。
- https://zerojudge.tw/ShowProblem?problemid=o076
題目說明:
$n$ 棟高樓,樓高為 $h_n$ ,會從某棟高樓上向右滑翔,要找到一組遞減序列,使序列長度達最長。
解題思路:
- 開一個 vector h,並多一個元素,做邊界檢查。
- 令這個邊界是 h 的上限最大值+1(題目的 h 是 $1 \leq h \leq 1000$ ),所以
h[n] = 1001。 - 設兩個變數
maxLen 紀錄序列最大長度,len 紀錄目前長度。 - 迴圈+判斷
h[i] > h[i+1],達成條件就 len++,否則更新最大長度 maxLen = max(maxLen, len + 1),並重置 len = 0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #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; }
|
- 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|$ 。
解題思路:
初始化一個二維 vector canvas[H][W] 為 $0$ 。
對於每次操作 $(r, c, t, x)$ :
- 遍歷整個畫布的每個座標 $(i, j)$
- 計算曼哈頓距離:$|i - r| + |j - c|$
- 若距離 $\leq t$,則將
canvas[i][j] += x。
這題可以用 BFS 優化,但畢竟還是第二題,大概 APCS 也不想要這麼狠心,所以這測資範圍直接暴力解是可 AC 的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| #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;
for (int i = 0; i < H; ++i) { for (int j = 0; j < W; ++j) { int d = abs(i - r) + abs(j - c); 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; }
|