---
# System prepended metadata

title: 竹女資研 7th 補充題詳解

---

# 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 行。
每行輸出一個次方項，以降冪方式排列，對於每項輸出「次方：係數」。
若相加後Ｍ = 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;
}
```
:::