【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
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;
}
  1. 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 的。

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; // 讀入本次操作的座標 (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;
}