# 2025/01/03 打學弟的期末考 ## 前言 **因為是打學弟的考試,所以沒啥心得可講** **這篇大概純題解 + 個人一些看法** **然後是過了半年才補的文,所以看看就好。** ## 題目 ### pA :::success **給你一個至多三位的小數 $X$** **輸出一個最接近他的整數** ::: :::spoiler **想法 + 作法** 1. **`round`** 2. **`int(x+0.5)`** ::: :::spoiler **code** 1. ```cpp= #include <iostream> using namespace std; int main() { double x; cin >> x; cout << int(x+0.5) << '\n'; } ``` 2. ```cpp= #include <iostream> #include <cmath> using namespace std; int main() { double x; cin >> x; cout << round(x) << '\n'; } ``` ::: :::warning **用 `float` 會吃WA** ::: ### pB :::success **$N \times N$ 的矩形** **由一個點往上下左右、四個斜向跑 $N-1$ 次組成的 $N$ 位數字** **求最大** ::: :::spoiler **想法+作法** **經典的實作題** 1. **二維可以用一維string存** 2. **從 $N \to 1$ 或 $1 \to N$ 的時候用取模** **負數取模要取好** 3. **string 能直接max** ::: :::spoiler **code** ```cpp= #include <iostream> using namespace std; string v[10] int dx[] = {1, 1, 1, 0, 0, -1, -1, -1}; int dy[] = {1, 0, -1, 1, -1, 1, 0, -1}; int main() { int n; cin >> n; for(int i = 0; i < n; i++) cin >> v[i]; string ans; for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) for(int k = 0; k < 8; k++) { string tmp; for(int l = 0; l < n; l++) tmp += v[((i+dx[k]*l)%n+n)%n][((j+dy[k]*l)%n+n)%n]; ans = max(tmp, ans); } cout << ans << '\n'; } ``` ::: ### pC :::success **有二字串 $S$、$T$** **可以在$S$中選擇相同兩字元的中間穿插同樣的字元** **問是否能將 $S$ 變成 $T$** ::: :::spoiler **想法+作法** 1. **放兩個指針,仔細維護** **這樣會較為複雜** 2. **用`pair<char,int>`紀錄字元跟壓縮的數量** **實作起來沒有比較輕鬆** ::: :::spoiler **code** ```cpp= #include <iostream> using namespace std; int main() { string a, b; cin >> a >> b; bool ok = true; int i = 0, j = 0; while(j < b.size() && i < a.size()) { if(a[i] == b[j]) i++, j++; else if(i >= 2 && a[i-1] == a[i-2] && a[i-1] == b[j]) j++; else {ok = false; break;} } while(j < b.size() && i == a.size() && i >= 2 && a[i-1] == a[i-2] && a[i-1] == b[j]) j++; if(ok && j == b.size() && i == a.size()) cout << "Yes\n"; else cout << "No\n"; } ``` ::: ### pD :::success **$X$、$Y$ 兩家公司各有不同的收費方式** **$X$ 公司 : 每公升收費 $A$ 元** **$Y$ 公司 : 不超過 $C$ 公升收 $B$ 元,超過了收 $B + D \times \text{超過幾公升}$元** **有一個人有 $P$ 公升,選擇最低費用公司會花費多少** ::: :::spoiler **想法 + 作法** **按照題目敘述寫** ::: :::spoiler **code** ```cpp= #include <iostream> #include <iostream> using namespace std; int main() { int a, b, c, d, p; cin >> a >> b >> c >> d >> p; cout << min(a*p, b+max(0, p-c)*d) << '\n'; } ``` ::: ## 總結 **pA 聽說卡了小細節,但個人寫起來感覺還好** **反正競程上用不到float 所以就別用比較好** **pB 實作題,取模方面有點細節** **pC 也是實作題,且有點麻煩** **pD 單純數學水題**