# 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;
}
```
:::