# 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 單純數學水題**