# YTP 2023 部份題解
By abc864197532
---
## 題目們
- 國中組初賽 p2 Bocchi and Mango Masks
- 高中組初賽 p1 Nijika or Doritos?
- 國中組決賽 p3 Eleven
- 高中組決賽 p4 Yuna and Quests
---
### Bocchi and Mango Masks
給定 $n$ 個長方體 $A_i$ 與長方體 $B$,問有幾個長方體 $A_i$ 可以在經過旋轉或翻轉後被放在 $B$ 裡面。
$1 \leq n \leq 1000$
----
- 長方體旋轉對應到的邊長組合只有 $3!$ 種
- $(a, b, c), (a, c, b), (b, a, c), (b, c, a), (c, a, b), (c, b, a)$
- 硬寫的話把每種都判完就好了
----
- 假設已經將長方體 $B$ 的三邊長排序好,那其實上面敘述的條件其實只有排序好的那個是重要的
- 枚舉一下 case 會發現其他條件符合的時候這個也會符合
----
- 假設長方體 $B$ 的三邊長為 $L \leq W \leq H$,某個長方體 $A_i$ 的三邊長為 $l \leq w \leq h$。
- 則若 $l \leq L, h \leq W, w \leq H$,就代表 $l \leq L, w \leq h \leq W, w \leq h \leq H$。
- 其他情況也可以用類似的想法推出來。
----
- 賽中多數人都是用後面的方法過的
- [標程](https://ideone.com/iZPBOI)
---
### Nijika or Doritos?
給定兩種三角形 $A, B$,$q$ 筆詢問某個三角形跟哪個全等或都沒有
$1 \leq q \leq 1000$
----
- 國中數學:可以用 SSS 判斷兩三角形是否全等
- 將三角形的三邊長算出來,再判斷組成邊長的數字是否相同即可
----
- 直接用浮點數存邊長會有浮點數誤差
- 點都是格子點 $\implies$ 邊長的平方一定是個整數
- 所以使用邊長平方作為比較依據就可以了
----
- 浮點數誤差
```cpp=
#include <bits/stdc++.h>
int main() {
long long x = 98765432123456789;
long long y = 98765432123456798;
double a = sqrt(x), b = sqrt(y);
if (a == b) {
cout << "Yes\n";
} else {
cout << "No\n";
}
}
```
----
- 少用 `std::pow` 函式
```cpp=
#include <bits/stdc++.h>
int main() {
long long a = 864197532;
long long res1 = std::pow(a, 2);
long long res2 = a * a;
std::cout << res1 << '\n' << res2 << '\n';
}
```
----
- 輸出
```cpp=
746837374314891008
746837374314891024
```
----
- 很多人會 WA 的測資
```
0 0 0 1 1000000000 1000000000
0 7 0 8 1000000000 1000000000
1
0 7 1 7 1000000000 1000000000
```
需要比較:
$\sqrt{1999999984000000050}$
跟
$\sqrt{1999999984000000064}$
----
- [標程](https://ideone.com/CBPAzR)
---
### Eleven
給定 $n$,輸出最大的數使得:
- 每個數碼都非 $0$
- 數碼和為 $n$
- 可被 $11$ 整除
$1 \leq n \leq 10^5$
----
- $11$ 倍數判別法
- $n$ 的奇數位數碼和減掉偶數位數碼和可以被 $11$ 整除 $\iff$ $n$ 可被 $11$ 整除
- 接著就來分一點 case
----
- $n$ 是偶數:範測告訴你 $n = 2$ 的答案,有沒有辦法推廣?
- 輸出 $n$ 個 $1$。
- 顯然他是最大的,而且根據前面所說他顯然可以被 $11$ 整除
----
- $n$ 奇數:範測告訴你 $n = 3$ 無解,那有沒有其他無解的情況?
----
- 令所需數字的奇數位數碼和為 $a$,偶數位為 $b$
- 由於 $n = a + b$ 為奇數,所以可以得知 $|a - b| \geq 11$。
- 若 $n < 11$,則顯然不可能
- 若 $n = 11$,則 $a$ 或 $b$ 有一項會 $= 0$,但因為滿足條件的數至少為兩位數所以不可能
----
- $n = 13$ 有解嗎?
- $913$!
- 而剩下 $n > 13$ 的 case 會發現其實就只要在 $913$ 後面補 $n - 13$ 個 $1$ 即可
----
結論
- $n$ 偶數,輸出 $n$ 個 $1$
- $n$ 奇數且 $n \leq 11$,無解
- 否則輸出 $913$ 後面接 $n - 13$ 個 $1$
- [標程](https://ideone.com/NyPD6X)
---
### Yuna and Quests
座騎與服裝都分別有兩種,每次操作可以將座騎或服裝其中之一換成另一種。
請依序完成 $n$ 個條件,每個條件會對於座騎以及服裝,分別限制需要的種類,也可以沒有限制。問完成全部條件所需要花費的最少操作數。
$1 \leq n \leq 1000$
----
#### 作法一
- 考慮 $dp[i][a][b]$ 代表已經完成前 $i$ 個條件,且目前座騎為第 $a$ 種服裝為第 $b$ 種,這樣情況下的最少操作數
- 轉移先判斷是否滿足條件,再枚舉進行的操作
- 總複雜度 $O(n)$,但有個 $2^4$ 的常數
----
#### 作法二
- 觀察到服裝和座騎這兩種是互相獨立的,所以可以分開計算這兩種個別的答案貢獻,再把兩者加起來
- 只要會算服裝的答案即可
----
- 觀察發現在「什麼服裝都可以」的任務不進行操作永遠是最優的,所以可以直接把那些任務移除掉
- 那之後就可以有很簡單的 greedy 策略:在需要換服裝的時候再進行操作就好
- 總複雜度為 $O(n)$。
----
- [標程(作法一)](https://ideone.com/1KsjvL)
- [標程(作法二)](https://ideone.com/4zDqWC)
---
### 結束
謝謝各位~
{"title":"YTP 2023 部份題解","description":"題目們","contributors":"[{\"id\":\"d3e63fe1-dc3b-4f31-97c0-10807543b008\",\"add\":7256,\"del\":4240}]"}