# TOI 練習賽新手組 - 1 :::info 稍微可愛一點的題目,好耶! 也許我的想法不是最好的也不是最簡潔的,但還是可以參考一下 ? ? ~~如果出現奇怪的變數看起來沒意義,那可能是他真的沒有意義,我忘記把我的掙扎路徑刪掉了~~ 但我確定這些程式碼都是可以 AC 的。 ::: **範圍**:輸入輸出、if/else、迴圈、陣列 TOI 練習賽新手組是踏入競程圈的第一步 (?) 寫起來滿有挑戰性,卻不需要用到複雜的算法。 如果有打算考 APCS 可以試著寫寫看,會有很大的幫助喔 ! ! ! ### [e621 免費停車](https://zerojudge.tw/ShowProblem?problemid=e621) **題目簡述:** 輸入一個正整數 n,代表一周選擇幾天放送優惠。 接下來每 n 行,輸入一個區間 ( A , B ),從此區間剔除可以被某數 C 整除的車位號碼,則剩下的為應該輸出的免費車位號碼。 若沒有免費車位,則輸出 No free parking spaces. >小提示: >啊就取餘數咩 == :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { int n, a, b, c; cin >> n; for (int i = 0; i < n; i++) { int f = 0; cin >> a >> b >> c; for (int j = a + 1; j < b; j++) { if (j % c) { cout << j << " "; f = 1; } } if (!f) cout << "No free parking spaces."; cout << "\n"; } return 0; } ``` ::: ### [e622 虛擬寵物大師](https://zerojudge.tw/ShowProblem?problemid=e622) **題目簡述:** 輸入 n、S,代表虛擬寵物數量和星塵沙子數量。 接下來 m 行 ( 1 ≦ m ≦ n ),每行輸入 CP 和 IV,分別是編號 m 之虛擬寵物的 CP 值和 IV 值。 每升級一等會消耗 1000 星塵,此外 IV 值越高代表升級一等時,CP 值增幅越大。 輸出要捕捉的虛擬寵物編號與其成長後最高 CP 值。 :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { int n, s, a, b, A = 0, ans; cin >> n >> s; for (int i = 0; i < n; i++) { int t = s / 1000; cin >> a >> b; if (b >= 40) a += 100 * t; else if (b >= 30) a += 50 * t; else a += 10 * t; if (a > A) { A = a; ans = i + 1; } } cout << ans << " " << A << "\n"; return 0; } ``` ::: ### [e623 PPAP](https://zerojudge.tw/ShowProblem?problemid=e623) **題目簡述:** 輸入一個正整數 n,代表拿到號碼牌的數字。 根據號碼牌上的數字分送 Pen、Pineapple、Apple、Pineapple Pen,每一輪每種物品都是前一輪發放數量加一。 依據 n ,輸出當前號碼牌會拿到 Pen、Pineapple、Apple 還是 Pineapple Pen。 >小提示: >先計算經過了 t 輪,再計算此輪一次發放 t 個,幾次才會超過。 :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { int n, s = 0, t = 0, cnt = 0; cin >> n; while (s + 4 * t < n) { s += 4 * t; t++; } while (s + t < n) { s += t; cnt++; } if (!cnt) cout << "Pen\n"; else if (cnt == 1) cout << "Pineapple\n"; else if (cnt == 2) cout << "Apple\n"; else cout << "Pineapple pen\n"; return 0; } ``` ::: ### [e806 多項式計算](https://zerojudge.tw/ShowProblem?problemid=e806) **題目簡述:** 共有兩組多項式,每組為兩行輸入。 每組輸入分別如下:輸入正整數 N,表示此多項式有幾項。 接下來輸入 N 對整數 p、c,分別代表次方數和該項的係數。 兩多項式相加後,除去係數為 0 之項後得到 M 項,共輸出 M 行。 每行輸出一個次方項,以降冪方式排列,對於每項輸出「次方:係數」。 若相加後M = 0,則輸出「NULL!」。 >小提示: >用陣列 r [ i ] 記錄第 i 次方項的係數 :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { long long n, p, a, r[1005] = {0}, f = 0; for (int ii = 0; ii < 2; ii++) { cin >> n; for (int i = 0; i < n; i++) { cin >> p >> a; r[p] += a; } } for (int i = 1000; i >= 0; i--) { if (r[i]) { cout << i << ":" << r[i] << "\n"; f = 1; } } if (!f) cout << "NULL!\n"; return 0; } ``` ::: ### [e807 降雨量統計](https://zerojudge.tw/ShowProblem?problemid=e807) **題目簡述:** 輸入有七行,依序表示週一至週日的降雨資訊。 一行有 4 個浮點數 M、A、N、E,依序代表每天四個時段的降雨量。 輸出一週內降雨量最多的日子和一週內降雨量最多時段,以換行間隔。 >小提示: >用陣列儲存每個時段的降雨量,用一個變數紀錄單日最高降雨量。 :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; float a[5], n, m, t, d, c; int main() { for (int i = 0; i < 7; i++) { t = 0; for (int j = 0; j < 4; j++) { cin >> n; a[j] += n; t += n; } if (t > m) { m = t; d = i + 1; } } m = 0; for (int j = 0; j < 4; j++) { if (a[j] > m) { m = a[j]; c = j; } } cout << d << "\n"; if (!c) cout << "morning\n"; else if (c == 1) cout << "afternoon\n"; else if (c == 2) cout << "night\n"; else cout << "early morning\n"; return 0; } ``` ::: ### [e808 不再傻傻等公車](https://zerojudge.tw/ShowProblem?problemid=e808) **題目簡述:** 第一行輸入 n,代表公車行經站牌數量。 第二行有兩個數 h、m,代表公車的出發時間為 h 點 m 分。 接下來有 n 行,每行有正整數 t,代表前一站到此站的公車行駛時間。 最後一行有 ( p + 1 ) 個整數,前 p 個整數為正整數(由小到大排列)代表欲查詢第幾站的到站時間。 最後一個整數為 0,代表查詢結束。 輸出 p 個欲查詢站牌的到站時間,輸出時間為 24 小時制,格式為 hh : mm ( 例:19 : 07 )。 >小提示: >~~這題感覺難在輸入輸出~~ >把單位換成分鐘會比較好算 >h、m < 10 的時候要輸出 0 >btw 隱藏測資會有跨日的問題,要想辦法解決 :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { int n, h, m, t[30], p; cin >> n >> h >> m; t[0] = h * 60 + m; for (int i = 1; i <= n; i++) { cin >> t[i]; t[i] += t[i - 1]; } while (cin >> p && p) { m = t[p] % 60; h = t[p] / 60; if (h >= 24) h %= 24; if (h > 9) cout << h << ":"; else cout << "0" << h << ":"; if (m > 9) cout << m << "\n"; else cout << "0" << m << "\n"; } return 0; } ``` ::: ### [e948 基礎代謝率](https://zerojudge.tw/ShowProblem?problemid=e948) **題目簡述:** BMR ( 男 ) = ( 13.7 × 體重 ( kg ) ) + ( 5.0 × 身高 ( cm ) ) - ( 6.8 × 年齡 ) + 66 BMR ( 女 ) = ( 9.6 × 體重 ( kg ) ) + ( 1.8 × 身高 ( cm ) ) - ( 4.7 × 年齡 ) + 655 輸入正整數 N,代表要計算 BMR 的人數。 接下來 N 行,每行有四個正整數 G、A、H、W。 G:1 ( 男 ) 或 0 ( 女 ),代表計算者的性別。 三個正整數 A、H、W 代表計算者的年齡、身高(cm)、體重(kg)。 輸出一個浮點數,代表該人的基礎代謝率。BMR 四捨五入至小數點後兩位。 >小提示: >~~又是難在輸入輸出的一題~~ >這題很機車,輸出需要小數點兩位。 >以前寫 C 或是 Python 的同學就會知道要怎麼處理。 >神奇魔法:printf ("%.2f", float_num); :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { float n, g, a, h, w; cin >> n; for (int i = 0; i < n; i++) { cin >> g >> a >> h >> w; if (!g) { float s = (9.6 * w) + (1.8 * h) - (4.7 * a) + 655; printf ("%.2f\n", s); } else { float s = (13.7 * w) + (5.0 * h) - (6.8 * a) + 66; printf ("%.2f\n", s); } } return 0; } ``` ::: <br> :::warning 碎碎念: 你可能會想說 printf 是什麼奇怪的東西,和 cout 有什麼不一樣 ? printf ("%d", int_num); 其實 printf 是 C 語言的輸出語法,意思是輸出名叫 int_num 的正整數。 雖然需要根據型別調整函式 ( %d、%c、%f …… ),寫起來比較麻煩,但執行速度比 cout 快。 ::: ### [e968 班級名單](https://zerojudge.tw/ShowProblem?problemid=e968) **題目簡述:** 先輸入一個整數 N,代表班上有幾位同學。 第二行有三個數字,代表三位請假同學的座號。 輸出 N - 3 列,將有出席同學的座號由後往前印出來,每列為一個同學的座號 ( 格式:No. 1 ),不能有多餘換行。 >小提示: >~~還是難在輸入輸出~~ >如何避免輸出最後一個多餘的換行 ? :::spoiler **程式碼:** ```cpp= #include <iostream> #include <cmath> using namespace std; int main() { int n, a[3]; cin >> n; for (int i = 0; i < 3; i++) cin >> a[i]; if (n != a[0] && n != a[1] && n != a[2]) { cout << "No. " << n; } for (int i = n - 1; i > 0; i--) { if (i != a[0] && i != a[1] && i != a[2]) { cout << "\n" << "No. " << i; } } return 0; } ``` ::: ### [e969 大吃大喝](https://zerojudge.tw/ShowProblem?problemid=e969) **題目簡述:** 輸入總共有三個整數 N、M、K,分別為 Wayne 總共帶了多少錢、他每隔幾分鐘進食一次,K = 0 的話代表從蘋果派開始吃,K = 1 的話則代表從玉米濃湯開始。 輸出包含經過時間、吃的食物與剩餘金額。 >小提示: >~~好全部題目都難在輸入輸出~~ >這題可以用到 [d063 0 與 1](https://zerojudge.tw/ShowProblem?problemid=d063) 的想法 >把會重複輸出的部分存進陣列 str [ 0 ] 和 str [ 1 ] 裡。 >~~btw 我看到這題有人的程式碼高達 70 行,辛苦了同學~~ :::spoiler **程式碼:** ```cpp= #include <iostream> using namespace std; int main() { int n, m, k, s[2], cnt = 0, f = 0; string str[2]; cin >> n >> m >> k; s[0] = 32, s[1] = 55; str[0] = " eats an Apple pie", str[1] = " drinks a Corn soup"; while (n - s[k] >= 0) { n -= s[k]; cout << cnt << ": Wayne" << str[k] << ", and now"; if (n == 1) cout << " he has 1 dollar.\n"; else if (!n) cout << " he doesn't have money.\n"; else cout << " he has " << n << " dollars.\n"; k = -k + 1; cnt += m; f = 1; } if (!f) cout << "Wayne can't eat and drink.\n"; return 0; } ``` :::