臺北市一 O 二學年度高級中等學校電腦程式設計競賽決賽試題
(高中組)
說明: 1. 本試卷共有四題,每題 25 分。 2. 請記得隨時備份自己的程式。試題 1:分散式資料儲存系統中資料傳遞路徑與資料維護
問題敘述
一個分散式的資料儲存系統可以有效地運用區域網路中各個機器的儲存空間,例 如在公司裡有 500 台個人電腦,我們希望任何一台機器可以把檔案存放在其它指 定的電腦上,但是考量網路的流量與各機器紀錄其他機器連線的負擔,我們希望 每一台機器只連線到幾台機器,例如下圖(a)為 4 台機器一維(d=1)的連線方式, 一維連線時每一台機器只連到相鄰的兩台機器,下圖(b)為 16 台機器,每一維度 4 台機器(n=4)的二維(d=2)連線方式,二維連線時每一台機器最多只有四台機器直 接相鄰 上圖中標示的數字為每一機器的編號,如果每一維度上只有 n(=4)台機器,則可 以把這個編號看成是 n 進位的數字,每一維度的機器編號對應到一位數字。當機 器數量更多時,我們可以用更高維度的架構來連線,如上圖(c)是每一維度 3 台機 器(n=3)在三維空間(d=3)中的連線架構(此時每一台機器最多與 2*d=6 台機器相 連),共有 nd 台機器連接在一起,這個三維的連線架構基本上可以看成將二維平面 的連線架構複製兩次,把複製的節點和原本的節點連接起來。 1. [7 分] 請撰寫一個程式,輸入每個維度的機器數(n)以及連線的維度(d),以及 任意 A,B 兩台不同機器的編號,輸出 A,B 之間一條最短的路徑,如果 A 機器要 將資料存放到 B 機器上,需要沿著這條路徑將資料一站一站接力傳遞過去 2. [18 分] 請撰寫一個程式,輸入每個維度的機器數(n)、連線的維度(d)、以及 一台指定的機器,輸出由該機器出發可以經過所有機器的路徑,其中每一台機 器只可以經過一次,在維護整個分散式儲存系統資料的時候需要依照這個路徑來順序通知所有的機器 (輸出時每一列請印出 10 個節點) 注意: 程式輸出的第一列為輸入的資料, 測試資料會包含 2n20, 1d20, 路徑 不只一條時只需要列印出一條即可 程式執行範例:
試題
2.
極限運動
問題敘述
多明哥是一位在極限運動用品店工作的運動鞋設計師,他所設計的高彈力運 動鞋能讓極限運動者的跳躍能力大增。在今年的萬聖節,多明哥穿著由他所設計 的運動鞋(並同穿戴有其它讓他能安全無虞的防護裝置)去南美洲一個小國家探險; 當天下午他在某座山的山腳發現了一棟高聳在此山巔的印加帝國古神殿,是可以 經由一條有很多個階梯組成、通往山巔的步道而到達。但因年久失修的關係,此 步道上有數個階梯嚴重損壞而不能踩踏。 假設此步道由山腳起始點往上數到山巔的古神殿所在處,總共有 n 個階梯(古 神殿所在處剛好位在第 n 個階梯);而多明哥每一步最多可走的階梯數為 m 個階梯 (舉例來說,從第 k 個階梯一步最多可走到第 k+m 個階梯)。 聰明的你(妳),請幫多明哥寫一個程式,計算他總共有多有種不同的步行方式 來走此步道,由腳起始點通往山巔的古神殿。 程式一 輸入: 3 5 00000 21210 輸出: 3 5 00000 21210 00000 01000 01100 01200 01210 11210 21210 程式二 輸入: 3 4 0000 輸出: 3 4 0000 0000 0001 0002 0012 0011 0010 0020 0021 0022 0122 0121 0120 0110 0111 0112 0102 0101 0100 0200 0201 0202 0212 0211 0210 0220 0221 0222 1222 1221 1220 1210 1211 1212 1202 1201 1200 1100 1101 1102 1112 1111 1110 1120 1121 1122 1022 1021 1020 1010 1011 1012 1002 1001 1000 2000 2001 2002 2012 2011 2010 2020 2021 2022 2122 2121 2120 2110 2111 2112 2102 2101 2100 2200 2201 2202 2212 2211 2210 2220 2221 2222 1 2 3 n-1 n n-2 第n-2個階梯嚴重損壞 (舉例來說) 山腳起始點 第一個階梯 山巔的古神殿是位在於第n個階梯輸入說明
第一行輸入有兩個整數值 n (2 n 1000)與 m (1 m 10),以空格間隔;其 中 n 代表由山腳起始點到山巔的古神殿總共有 n 個階梯,m 代表多明哥每一步最 多可走的階梯數。 第二行輸入有兩種情況:其一為整數值 0 (代表此步道沒有階梯嚴重損壞); 其二為一個整數值 d (1 d 10)(代表此步道有 d 個階梯嚴重損壞),後面緊接著 d 個整數值 p1, p2, …,pd (代表此步道中階梯嚴重損壞的位置,是由小排到大)輸出說明
為一個整數值,說明步行方式的總數;程式必須在 30 秒內完成。 輸入範例一 輸出範例一 3 2 0 3試題 3. 慷慨的老闆
問題敘述
開心企業今天舉辦尾牙餐會,老闆準備了一個很大的圓盤,讓員工用射飛鏢 的方式決定自己今年的年終獎金。以下圖為例,如果員工射中了位置 3,可以獲 得 50 單位的獎金,如果射中了位置 5,則只能獲得 6 單位的獎金。當天因為氣 氛太嗨了,在所有員工都射完飛鏢後,老闆突發奇想,願意提高大家的獎金。老 闆希望每位員工的獎金改成射中的位置周圍 R 格裡面最大的值。例如若 R = 1, 則射中位置 5 的人,獎金變成 max{10, 6, 15} = 15 單位;若 R = 2,則射中位置 7 的人,獎金變成 max{6, 15, 10, 20, 25} = 25 單位。老闆為了表示自己很慷慨,想 要把 R 設定得越大越好;不過,財務長立刻跟老闆回報,明年度需要一大筆資金, 因此年終獎金的總額有個上限 B,所有員工所獲得的獎金總和不能超過這個值。 現在,老闆需要你幫忙寫一支程式,給定一個 N 格的輪盤和上面的數字、全 公司 K 個員工射中的位置、以及獎金總額上限 B,能夠很快計算出最大可以允許 的 R 值,好讓他在晚會結束時向大家宣布這個好消息。 輸入範例二 輸出範例二 25 3 2 4 8 368122 輸入範例三 輸出範例三 101 10 0 12117000158497882515028927526960 1 2 3 4 5 6 7 20 25 5 50 10 15 10 6
輸入說明
輸入的第一行為有一個整數 N (N 100,000),代表輪盤有多少格。接下去有 N 行,每行有一個非負整數,代表由位置 0 開始每一格的獎金(獎金值不超過 100)。 下一行有一個整數 K (K 20,000),代表全公司的員工人數。接下去有 K 行,每 行有一個整數,代表每個員工射中的位置。最後一行有一個整數 B,代表總獎金上 限。輸出說明
請輸出在總獎金不超過 B 的前提下,老闆能公布的最大 R 值(R 值為整數, 且不會超過 N/2)。輸入範例一
8 20 25 5 50 10 6 15 10 1 5 7輸出範例一
0輸入範例二
8 20 25 5 50 10 6 15 10 1 5 100輸出範例二
4輸入範例三
8 20 25 5 50 10 6 15 10 2 5 2 70輸出範例三
1試題 4. 工作挑選迷宮
問題敘述
今有一個任務是要將 m×n 個工作挑選一部份來進行,第一個工作(註:矩陣左 上角)必須第一個進行,第 m×n 個工作(註:矩陣右下角)則必須最後一個進行,但 中間的工作則依下面的規則來挑選進行:將所有工作對應到一個 m×n 的二維陣列 A,第一個工作對應到矩陣元素 A[1,1], 第二個工作對到應矩陣元素 A[1,2],…, 第 n 個工作對應到矩陣元素 A[1,n],第 n+1 個工作對應到矩陣元素 A[2,1],…,第 m×n 個工作對到應矩陣元素 A[m,n];每完成一個工作,就需選擇其上、下、左、 右相鄰之一個矩陣元素所對應的工作來繼續進行。 如下圖的例子中,這個 5×6 矩陣,其每個元素的數值代表所分別對應之 30 工 作中的每個工作所需耗費的時間。為了簡化,假設每個工作所需的時間為 1 至 9 的數字,並且假設 1≦m,n≦999。根據上面的規則,請你設計一個程式可以在最短 的時間內完成這個任務。 [ ]