# 0110 第六次社課 ||又名期末賽|| :::info 盡量**先想過一次**,如果真的想不出來,再參考解答 **不要複製貼上程式碼**,要多練習才會進步喔 ! 好啦但還是希望有人會看 ```_(:3」∠)_``` 我寫得很辛苦 ::: 很抱歉過了這麼久才寫題解 TAT,最近真的忙到要芬掉了呃呃呃 ### 先前情提要一下 **期末賽範圍**: 輸入輸出、運算子、流程控制、迴圈、陣列、遞迴,總之就是社課內容大雜燴。 還有如果你想的話……一點點 DP ? 以及各種有關資訊和竹女的奇怪問題們。 這次的題目都**不需要用到 io 優化**,**數字最大只開到 long long**,可以不用擔心 ( ? ) btw 如果你覺得你的程式碼沒有問題,但輸出的小數總是差那一兩點意思……不要偷懶請**把全部的 int 或 float 宣告成 double** 謝謝。 ~~假設你卡的是 7 的循環這題,那這個方法就對你沒用了哈哈~~ 至於用 python 的捧油,對不起我救不了你,我跟 python 不熟 ( 猙獰臉 ) 最後最後,感謝偉大的公活蕭伃肴幫我出了第二到六題,還有社師生的測資 orz。 ### [m917. 你長得像 XX](https://zerojudge.tw/ShowProblem?problemid=m917) **題目簡述:** 輸入一個字串 ~~例如茶碗蒸~~,輸出一行文字 ~~你長得像茶碗蒸~~。 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { string str; cin >> str; cout << "你長得像" << str << "!!!\n"; } ``` ::: <br> 然後給那些直接 AC 沒看到測資的人看這些莫名其妙的測資: ![image](https://hackmd.io/_uploads/BkrdsnUtT.png =70%x) ### [m961. 魷魚的數學作業](https://zerojudge.tw/ShowProblem?problemid=m961) **題目簡述:** 輸入一個整數 n,接下來輸入 n 行數字。每行為一個正整數 m。 輸出這 n 個數字的平均值。 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { double n, a, ans = 0; cin >> n; for (int i = 0; i < n; i++) { cin >> a; ans += a; } cout << ans / n << "\n"; } ``` ::: <br> ### [m962. 肴肴的上課公車](https://zerojudge.tw/ShowProblem?problemid=m962) **題目簡述:** 輸入兩個正整數 H、M,代表肴肴起床的時間,分別為小時和分鐘。 根據此二數判斷肴肴是否會遲到,若可以準時到校,輸出 "準時到校!!!" 反之,則輸出 "遲到:(" :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { int h, m; cin >> h >> m; if (h > 6) cout << "遲到:(\n"; else if (m > 30) cout << "遲到:(\n"; else cout << "準時到校!!!\n"; } ``` ::: <br> ### [m963. Kookie的美術畫作](https://zerojudge.tw/ShowProblem?problemid=m963) **題目簡述:** 輸入一個正整數 n,接下來輸入 n 個數字 S 代表每一幅畫的分數。 依序輸出被裱起來的畫作編號 L。 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { int n, a; cin >> n; for (int i = 0; i < n; i++) { cin >> a; if (a > 7) cout << i + 1 << " "; } } ``` ::: <br> ### [m964. 生米的理財利率](https://zerojudge.tw/ShowProblem?problemid=m964) **題目簡述:** 輸入兩個正整數 n、p,分別代表本金與經過年數。 輸出 n 年後可以賺到多少錢,以複利計算。 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { double p, n; cin >> p >> n; for (int i = 0; i < n; i++) p *= 1.1; cout << p << "\n"; } ``` ::: <br> ### [m965. 善良的社幹們](https://zerojudge.tw/ShowProblem?problemid=m965) **題目簡述:** 輸入一個正整數 n,接下來輸入 n 個數字。 輸出這 n 個數字的標準差。 > 小提示: > 代公式 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> #include <cmath> using namespace std; int main() { double n, l, s = 0, a = 0, ans; cin >> n; for (int i = 0; i < n; i++) { cin >> l; s += l * l; a += l; } cout << sqrt ((s - a * a / n) / n); } ``` ::: <br> ### [m922. 7 的循環](https://zerojudge.tw/ShowProblem?problemid=m922) **題目簡述:** 輸入兩個正整數 n、d,分別代表被除數和小數位數。 輸出 n 除以 7 的答案並取到小數點後第 d 位數。 > 小提示: > 想一下長除法是怎麼做的 > btw 這題用不了 setprecision( ) 了,精確度不夠。 :::spoiler **AC 程式碼 (直觀版):** <br> ```cpp= #include <iostream> using namespace std; int main() { int n, d, t; cin >> n >> d; cout << n / 7 << "."; t = (n % 7) * 10; for (int i = 0; i < d; i++) { cout << t / 7; t = (t % 7) * 10; } } ``` ::: <br> :::spoiler **AC 程式碼 (半夜腦子不清楚版):** <br> ```cpp= #include <iostream> using namespace std; int main() { int n, d, t, p[6] = {1, 4, 2, 8, 5, 7}; cin >> n >> d; cout << n / 7 << "."; t = n % 7; if (!t) { for (int i = 0; i < d; i++) cout << 0; return 0; } else if (t == 1) t = 1; else if (t == 2) t = 3; else if (t == 3) t = 2; else if (t == 4) t = 5; else if (t == 5) t = 6; else t = 4; for (int i = 0; i < d; i++) { cout << p[t - 1]; t++; if (t == 7) t = 1; } } ``` ::: <br> ### [m650. 水仙好吃,大王花也很好吃](https://zerojudge.tw/ShowProblem?problemid=m650) **題目簡述:** 輸入一個正整數 a,判斷此數是否為自冪數。 如果是則輸出 "YES",否則輸出 "NO"。 > 小提示: > 用 while loop 一個一個取出數字去計算 > 這題需要用到社課曾經提到過的 pow ( n , a ) :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> #include <cmath> using namespace std; int main() { long long n, a, sum = 0, t[10], cnt = 0; cin >> n; a = n; while (n > 0) { t[cnt] = n % 10; n /= 10; cnt++; } for (int i = 0; i < cnt; i++) sum += pow(t[i], cnt); cout << ((sum - a)? "NO" : "YES") << "\n"; } ``` ::: <br> ### [m921. 築呂姿顏開張](https://zerojudge.tw/ShowProblem?problemid=m921) **題目簡述:** 輸入一個整數 p,代表今日與社長合照的價格。 接下來輸入四行數字,每行有兩個數字 m、n,分別代表該餐點編號和餐點份數。 餐廳酌收初始花費的 10 % 服務費,並且如果出示與社長的合照 可抵免服務費。 輸出最少花費以及是否需要與社長合照。 > 小提示: > 用一個陣列儲存個餐點的價格會比較簡單明瞭 > 如果服務費大於與社長合照的價錢,則與社長合照。 :::spoiler **AC 程式碼:** <br> ```cpp= #include <iostream> using namespace std; int main() { double p, m, n, sum = 0; int menu[6] = {150, 330, 200, 180, 195}; cin >> p; for (int i = 0; i < 5; i++) { cin >> m >> n; sum += menu[i] * n; } if (sum * 0.1 < p) cout << (int)(sum * 1.1) << " " << 0; else cout << sum + p << " " << 1; } ``` ::: <br> ### [m960. 最佳上課效益](https://zerojudge.tw/ShowProblem?problemid=m960) **題目簡述:** 輸入 7 個正整數 n~i~ ( 0 <= i <= 6 ),分別代表今日七節課的上課點數。 上課效益 = 體力點 × 該節課點數 總效益等於七節課效益之和,輸出最佳上課總效益。 > DP 小提示: > 倍率 3 → 倍率 0 > 倍率 2 → 倍率 3 > 倍率 1 → 倍率 2 > 倍率 0 → 倍率 3 / 2 / 1 > 推得 dp 式: > dp [ i ] [ n ] = dp [ i - 1 ] [ n + 1 ] + a [ i ] × n > dp [ i ] [ 0 ] = max ( dp [ i - 1 ] [ 0 ], dp [ i - 1 ] [ 1 ], dp [ i - 1 ] [ 2 ], dp [ i - 1 ] [ 3 ]) :::spoiler **AC 程式碼 ( DP 解 ):** <br> ```cpp= #include <iostream> using namespace std; int main() { int a[7], dp[10][4] = {0}, ans = 0; for (int i = 0; i < 7; i++) cin >> a[i]; dp[0][3] = a[0] * 3; for (int i = 1; i < 7; i++) { dp[i][1] = dp[i - 1][2] + a[i]; dp[i][2] = dp[i - 1][3] + a[i] * 2; dp[i][3] = dp[i - 1][0] + a[i] * 3; dp[i][0] = max (dp[i - 1][0] , max (dp[i - 1][1] , max (dp[i - 1][2] , dp[i - 1][3]))); for (int j = 0; j < 4; j++) if (dp[i][j] > ans) ans = dp[i][j]; } cout << ans << "\n"; } ``` ::: <br> :::spoiler **AC 程式碼 ( 遞迴社師解 ):** <br> ```cpp= #include <iostream> using namespace std; int x[7], MAX; void dfs(int i, int hp, int val) { if(i >= 7) MAX = max(MAX, val); else if(hp > 0) dfs(i+1, hp-1, val+hp*x[i]), dfs(i+1, 3, val); else dfs(i+1, 3, val); } int main() { for(int i = 0; i < 7; ++i) cin >> x[i]; dfs(0, 3, 0); cout << MAX << "\n"; } ``` ::: <br> :::warning 這題理論上是防破台題,但看起來是沒什麼難度,因為已經有四個人寫出來了 然後我一開始用的是 DP ~~也有可能是我遞迴太爛,或是測資太小~~ 然後小小題外話就是,除了社員以外,其實也有一些神奇人物:place_of_worship:混進來寫了。 大家可以去膜拜一下 ( ? ) 還有我還是很不解到底怎麼猜出沂風園的,竹女的人都未必知道這個地方了 XD ::: ### 本學期結語 其實我一直有在想到底要不要打,既然你看到這一篇了,很顯然我最後還是打了。 雖然我不知道要說什麼 XD 就先從各位寫的題目開始好了,其實我真的沒有想到寫題目的人這麼多 :sob::sob: 常常半夜看到有人在寫扣,我真的為你的肝默默心疼一把。 之前 π 在我高一一點半在忙的時候叫我早點睡,我現在叫你們早點睡,如果是半夜看就更不應該了 == 然後我聽說有很多人想去考 6 月的 APCS ,我覺得可以趁寒假期間好好刷題,在這段期間內也有很多比賽例如 **TOI 初選**、**ytp**、**學科校內賽**,還有如果你想的話……考幹 ? 想豐富自己的程式經驗 ~~和學習歷程~~,我覺得很適合參加。 如果你寒假不想寫程式但想看 BL 小說,我推薦你看 「**C 語言修仙**」,我覺得作者真的很有料,你可以學到很多常用的競程、資安、人工智慧知識,順便複習上學期社課內容。 嚴格來說,我就是看了這本才決定要開始寫程式的。 ~~如果作者不要把拿到 IMO 和 IOI 的金牌寫得像吃飯喝水一樣簡單就更好了。~~ 最後,我個人認為義大利麵就應該拌 42 號混泥土,因為這個螺絲釘的長度很容易直接影響到挖掘機的扭矩。你往裡砸的時候,一瞬間他就會產生大量的高能蛋白,俗稱 UFO,會嚴重影響經濟的發展,以至於對整個太平洋,和充電器的核污染。再或者說透過這勾股定理很容易推斷出人工飼養的東條英機,他是可以捕獲野生的三角函數,所以說不管這秦始皇的切面是否具有放射性,川普的 N 次方是否有沈澱物,都不會影響到沃爾瑪跟維爾康在南極匯合。 真的超級感謝各位資研社的同學,希望各位有學到東西 orz