# 11/10 練習考 連結 -- https://hackmd.io/@sa072686/rJQSay2Gh 題目(共四題) -- * **PA** **題意** : :::success 給外圈格子數及內圈格子數求得整體長方形之長寬 ::: **解題思路** : :::info 先將格子數相加窮舉得出長寬之所有可能 再將長寬代入內圈格子數驗證 (題目已說明只有唯一解 所以得到答案就可以break了 ::: :::spoiler **程式碼** ``` cpp= #include <iostream> #include <map> using namespace std; int main() { int a, b; cin >> a >> b; int sum = a + b; map<int, int> list; for(int i = 1; i*i<=sum; i++) { if(!(sum%i)) {list[i] = sum/i;} } for(const auto &c : list) { if(c.first-2<1||c.second-2<1) continue; if((b%(c.first-2)==0)&&(b%(c.second-2)==0)) { cout << max(c.first,c.second) << ' ' << min(c.first,c.second) << endl; break; } } } ``` ::: **解題心得** : :::warning 寫完的時候忘記看有沒有超出範圍(看了很久... ::: * **PB**: **題意** : :::success 給A(500元)、B(100元)、C(50元)三數求他們的加總為定數的可能 ::: **解題思路** : :::info 巢狀迴圈暴力解就行 (這題的ABC都<=50而已 ::: :::spoiler **程式碼** ```cpp= #include <iostream> using namespace std; int main() { int a, b, c; cin >> a >> b >> c; int x; cin >> x; int sum = 0; for(int i = 0; i <= a; i++) { for(int j = 0; j <= b; j++) { for(int k = 0; k <= c; k++) { if(i*500+j*100+k*50==x) {sum++;} } } } cout << sum << endl; } ``` ::: **解題心得** : :::warning 本來想說先寫完暴力解法後再優化 結果就看到舒服的ABC範圍:) ::: * **PC**: **題意** : :::success 給予一個字串 偵測第一個A跟最後一個Z的距離 (一定有A和Z ::: **解題思路** : :::info 找到第一個A就開始偵測Z 並儲存他們的位子 ::: :::spoiler **程式碼** ```cpp= #include <iostream> using namespace std; int main() { string s; cin >> s; int ax = -1, zx; for(int i = 0; i<s.size(); i++) { if(ax!=-1) { if(s[i] == 'Z') {zx = i;} } else if(s[i]=='A') {ax = i;} } cout << zx-ax+1 << endl; } ``` ::: **解題心得** : :::warning 那時候忘記寫`cin >> s;`超白癡的哈哈 ::: * **PD**: **題意** : :::success 喵喵讀N的倍數頁 剩下我來讀(但我總共只會讀d頁 我讀x分鐘 喵喵y分鐘 (假如讀完d頁後的那一頁是喵喵要念的會加上去 ::: **解題思路** : :::info 1.迴圈計算然後偵測最後是不是喵喵要負責的 2.冷靜下來用國中數學解XD ::: **程式碼** : :::spoiler **1.爛解法** ``` cpp= #include <iostream> using namespace std; int main() { int n, p, x, y; cin >> n >> p >> x >> y; int i = 1; int sum = 0; while(p) { if(p==1 && !(i%n==0)) { if((i+1)%n==0) {sum += y;} } if(i%n==0) {sum += y;} else {sum += x; p--;} i++; } cout << sum << endl; } ``` ::: :::spoiler **2.速解** ```cpp= #include <iostream> using namespace std; int main() { int n, p, x, y; cin >> n >> p >> x >> y; cout << y*(p/(n-1))+p*x << endl; } ``` ::: **解題心得** : :::warning 我就是用第一個方法寫的笨蛋QQ ::: 賽後心得 -- 這次題目寫起來蠻歡樂的 但是還是有些小細節要注意 附上照片 -- ![螢幕擷取畫面 2024-01-05 213115](https://hackmd.io/_uploads/rkhxBYHua.png)