# 師大附中電算社46×47第一次社內賽 ## 題本 [完整題目 PDF 檔在這裡](https://www.dropbox.com/scl/fi/uuh6to5frwlgpetyw48b1/46-47.pdf?rlkey=mnpc0o4piqu92whx2ii7gwagd&st=67e9upu0&dl=1) [第一題 PDF 檔在這裡](https://www.dropbox.com/scl/fi/1ru449b1svc0gb4h3wukk/Sun.pdf?rlkey=djt4sj9hfqt1g3wcmb15sc824&st=hkbkks7b&dl=1) [第二題 PDF 檔在這裡](https://www.dropbox.com/scl/fi/me6981z4mga23w193f8gq/Guess.pdf?rlkey=j754opdehyw31hl78l4awexk9&st=13paix30&dl=1) [第三題 PDF 檔在這裡](https://www.dropbox.com/scl/fi/6g2ehuvq7ksyh72lf8y0k/God.pdf?rlkey=lpt7yu4wx47gx2i5eic7debte&st=b273v2lk&dl=1) ## 題解 ### 太陽 #### 出題者:cyano 題敘改編自 [NceS - Burn](https://youtu.be/4NhmcNf7wcE) 這一題簡單來說就是分別比較 $n + m$、$\sqrt{n^2+m^2}$、$m - n$、$\sqrt{n^2+m^2}$ 是否小於等於 $k$ ,是則輸出`Yes`,否則輸出`No`。值得注意的是C\+\+計算 $n^2+m^2$ 時可能會超過`int`的範圍,因此必須使用`long long`。 ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long n, m, k; cin >> n >> m >> k; if(n + m <= k) cout << "Yes\n"; else cout << "No\n"; if(n * n + m * m <= k * k) cout << "Yes\n"; else cout << "No\n"; if(m - n <= k) cout << "Yes\n"; else cout << "No\n"; if(n * n + m * m <= k * k) cout << "Yes\n"; else cout << "No\n"; } ``` ```py n = int(input()) m = int(input()) k = int(input()) if n + m <= k: print("Yes") else: print("No") if n * n + m * m <= k * k: print("Yes") else: print("No") if m - n <= k: print("Yes") else: print("No") if n * n + m * m <= k * k: print("Yes") else: print("No") ``` ### 猜測 #### 出題者:hi 這一題要輸出最少和最多能開出多少個寶藏,開出最少個寶藏必須要先把沒有寶藏的門全部開完再開有寶藏的,因此要計算出有多少沒有寶藏的門($n - t$),如果這個數字大於能開的門的數量結果就是 $0$ ,否則結果是能開的門的數量減掉沒有寶藏的門($m - (n - t)$)。開出最多個寶藏必須要先開有寶藏的門($t$),如果這個數字大於能開的門的數量則結果就是所有能開的門的數量($m$),否則就是所有有寶藏的門的數量($t$)。 ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long n, m, t; cin >> n >> m >> t; long long empty = n - t; if(empty >= m) cout << 0 << "\n"; else cout << m - empty << "\n"; if(t >= m) cout << m << "\n"; else cout << t << "\n"; } ``` ```py n = int(input()) m = int(input()) t = int(input()) empty = n - t if empty >= m: print(0) else: print(m - empty) if t >= m: print(m) else: print(t) ``` ### 電神 #### 出題者:R緯 這題首先要將 $b$ 反轉,測資限制可以發現 $a$ 必為二位數,因此 $a \div 10$ 的商就是 $b$ 的個位數,餘就是 $b$ 的十位數,因此`b = a / 10 + a % 10 * 10`(Python 為 `b = a // 10 + a % 10 * 10`)。接著由算幾不等式可以得知 $\frac{am+bn}{2} \ge \sqrt{ambn}=\sqrt{abk}$ ,因為 $p = am+bn$ 的最大值 , 因此 $p=2\sqrt{abk}$。若要知道 $f(x) = ax^2 + bx + p, x \in [L, R]$的最小值是否與 $f(x) = ax^2 + bx + p, x \in \mathbb{R}$ 的最小值相同只需要找出 $f(x) = ax^2 + bx + p, x \in \mathbb{R}$ 發生時的 $x=\frac{-b}{2a}$ 是否落在區間 $[L, R]$ 即可,若落在區間 $[L, R]$ 則 $y = 0$,否則 $y=min(f(L), (R))$。 ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a, k, L, R, b, p, y; double x; cin >> a >> k >> L >> R; b = a / 10 + a % 10 * 10; p = 2 * sqrt(a * b * k); x = 1.0 * -b / (2 * a); if(L <= x && x <= R) y = 0; else { long long y1 = a * L * L + b * L + p; long long y2 = a * R * R + b * R + p; if(y1 < y2) y = y1; else y = y2; } cout << p << "-" << b << "-" << y << "\n"; } ``` ```py a = int(input()) k = int(input()) L = int(input()) R = int(input()) b = a // 10 + a % 10 * 10 p = 2 * int((a * b * k) ** 0.5) x = -b / (2 * a) y = 0 if L <= x and x <= R: y = 0 else: y1 = a * L * L + b * L + p y2 = a * R * R + b * R + p if y1 < y2: y = y1 else: y = y2 print(p, b, y, sep = '-') ``` $f(x) = ax^2 + bx + p, x \in \mathbb{R}$ 發生時的 $x=\frac{-b}{2a}$ 不落在區間 $[L, R]$ 時的 $y$ 還有另外一種解法,只需要找出 $x$ 與 $L$ 、 $R$ 的距離,其中離 $x$ 較近者就是 $f(x) = ax^2 + bx + p, x \in [L, R]$ 最小值發生的地方。 ```cpp #include <bits/stdc++.h> using namespace std; int main() { long long a, k, L, R, b, p, y; double x; cin >> a >> k >> L >> R; b = a / 10 + a % 10 * 10; p = 2 * sqrt(a * b * k); x = 1.0 * -b / (2 * a); if(L <= x && x <= R) y = 0; else { if(abs(L - x) > abs(R - x)) y = a * R * R + b * R + p; else y = a * L * L + b * L + p; } cout << p << "-" << b << "-" << y << "\n"; } ``` ```py a = int(input()) k = int(input()) L = int(input()) R = int(input()) b = a // 10 + a % 10 * 10 p = 2 * int((a * b * k) ** 0.5) x = -b / (2 * a) if L <= x and x <= R: y = 0 else: if abs(L - x) > abs(R - x): y = a * R * R + b * R + p else: y = a * L * L + b * L + p print(p, b, y, sep = '-') ``` ## 優異參賽者表揚 ### 全場首殺 第一題:鯊鯊想睡睡(7分鐘) 第二題:1257891(13分鐘) 第三題:Zurichyoz(40分鐘) ### 前三名 第一名:Zurichyoz(300分) 第二名:Andrew1023666(230分) 第三名:cyan0(200分) ## Fun Facts 因為 zerojudge 只能用測資獨立計分不能用子題,所以第一題直接輸出 `No No No No`、`No No Yes No`、`No Yes Yes Yes`、`Yes Yes Yes Yes` 都可以得到部分分數,但好像沒有人這樣做。 還有 cyano 幫第三題加了一個 $L = R - 1$ 的子題,原本以為這樣只要檢查 $L$ 和 $R$ 就好,但寫題解的時候才發現 $x$ 是浮點數所以仍然可能會落在區間 $[L, R]$,所以同樣要用滿分的解法。