練習題
第一題
公司每年定期為員工實施健康檢查測量血壓,血壓的值包含收縮壓(較高者)與舒張壓(較低者)。
在測量完所有員工的兩項血壓數值後,公司會統計並輸出所有員工之收縮壓與舒張壓的平均值與中位數以資參考。
一串數字的中位數,是這些數字依序居中的值,例如:3,7,1,9,5的中位數是5;而5,8,2,6的中位數是5和6的平均(無條件捨去小數位)。
請協助完成函式split − range()以完成計算員工兩項血壓的中位數值。(注意:本程式並未使用排序來找出中位數。)
輸入格式:
- n:員工數
- ha1, …, han:員工的收縮壓
- hb1, …, hbn:員工的舒張壓
輸出格式:
- ha_avg : 員工收縮壓平均值
- hb_avg : 員工舒張壓平均值
- ha_md : 員工收縮壓中位數
- hb_md : 員工舒張壓中位數
需要完成及繳交的函式(擇一程式語言完成作答即可):
![]() | ![]() | ![]() | ![]() |
static void Split_Range(int split_pos, int mid, ref int left, ref int right) 函式
static void Split_Range(int split_pos, int mid, ref int left, ref int right) { | void split_range(int split_pos, int mid, int *left, int *right) 函式
void split_range(int split_pos, int mid, int *left, int *right) { | private static int[] splitRange(int splitPos, int mid, int left, int right) 函式
private static int[] splitRange(int splitPos, int mid, int left, int right) { | def split_range(pivot_position, mid, left, right): 函式
def split_range(pivot_position, mid, left, right): |
測資
範例測資:
測資1
輸入
5
139 93 121 142 116
68 89 58 67 83
輸出
122
73
121
68
測資2
輸入
4
125 132 130 108
96 67 82 96
輸出
123
85
127
89
測資3
輸入
3
149 147 119
77 68 70
輸出
138
71
147
70
測資4
輸入
10
108 140 141 132 140 100 116 116 94 90
89 55 84 77 79 91 74 72 85 99
輸出
117
80
116
81
測資5
輸入
1
134
55
輸出
134
55
134
55
1 | using System; |
1 | def average(data, n): |
第二題
台灣兒童保護基金會募集發票後,請志工協助對獎並統計中獎金額製作出公開報表,供捐贈者自由查閱。
統一發票獎別及獎金如下:
一張發票若同時符合2個獎項,則獎金以最高獎金為主,例如發票號碼同時符合五獎及六獎,則以五獎判定。
對獎主程式將呼叫WinPrize()函式以計算並回傳一張發票的中獎金額,據以統計全部發票的中獎總金額。
輸入格式:
- W:頭獎號碼,其中W為8碼字串
- N:發票總數,其中N為整數, 1≤N≤20
- P1: 第一張發票
- ...
- PN: 第N 張發票
輸出格式:
- M: 中獎總金額
需要完成及繳交的函式(擇一程式語言完成作答即可):
![]() | ![]() | ![]() | ![]() |
static int WinPrize(string W, string P)函式
static int WinPrize(string W, string P) { | int WinPrize (char W[], char P[])函式
int WinPrize (char W[], char P[]) { | private static int WinPrize(String W, String P)函式
private static int WinPrize(String W, String P) { | def WinPrize(W, P)函式
def WinPrize(W, P): |
測資
範例測資:
測資1
輸入
13859285
3
38592769
42893285
32398733
輸出
200
測資2
輸入
39384729
4
93859284
38494729
39472859
39485739
輸出
1000
測資3
輸入
22385928
3
22385927
38420848
48347982
輸出
0
測資4
輸入
00384929
3
82948372
00374872
82984929
輸出
4000
測資5
輸入
98384928
2
98384928
93849284
輸出
200000
1 | using System; |
1 | def WinPrize(W, P): |
第三題
一小時音樂廣播節目中共有4個單元,每單元結束時會進2分鐘的廣告,因此每個單元最多僅能播放13分鐘的歌曲。
單元中的音樂由AI程式從DJ準備的音樂歌單中,依下列規則選擇播放:
- 每首歌僅能播放一次,且須完整播完,不能中間卡歌。
- 歌曲播放順序以音樂歌單中長度最長且能完整播完的優先。若兩首歌曲長度相同,編號較大者優先選擇播放。
- 若有單元剩餘時間(進廣告前)無法完整播放下一首歌,則由節目DJ串場直至進廣告為止。
範例
DJ音樂歌單共有M=15首音樂,每首音樂的資訊記錄為<音樂編號,音樂長度>,15首音樂分別記錄為
<1, 210>,<2, 246>,<3, 252>,<4, 192>, <5, 186>,
<6, 282>,<7, 168>,<8, 162>,<9, 90>,<10, 234>,
<11, 252>,<12, 210>,<13, 258>,<14, 210>,<15, 204>。
我們根據音樂長度將音樂歌單由大到小排序,若音樂長度相同,則以音樂編號大者優先排序,其順序為
<6, 282>, <13, 258>,<11, 252>, <3, 252>, <2, 246>,
<10, 234>, <14, 210>, <12, 210>, <1, 210>, <15, 204>,
<4, 192>,<5, 186>, <7, 168>, <8, 162>, <9, 90>。
因此四個單元的歌單為:
第一個單元13分鐘,歌曲 6, 13, 10,剩餘6秒;
第二個單元13分鐘,歌曲 11, 3, 2,剩餘30秒;
第三個單元13分鐘,歌曲 14, 12, 1, 9,剩餘60秒;
第四個單元13分鐘,歌曲 15, 4, 5, 7,剩餘30秒。
請協助完成程式中MusicOrder函式,回傳該單元的音樂播放清單。
輸入格式:
- M:音樂歌單的歌曲數,音樂編號就是1到M。
- X1 ... XM:每一首音樂的時間長度(單位:秒),0 < Xi ≤ 600,其中1 ≤ i ≤ M,兩數之間以一空格分隔。
輸出格式:
- Y1 … Yk T1:第一單元音樂播放清單及剩餘時間,兩數之間以一空格分隔。
- Y1 … Yk T2:第二單元音樂播放清單及剩餘時間,兩數之間以一空格分隔。
- Y1 … Yk T3:第三單元音樂播放清單及剩餘時間,兩數之間以一空格分隔。
- Y1 … Yk T4:第四單元音樂播放清單及剩餘時間,兩數之間以一空格分隔。
需要完成及繳交的函式(擇一程式語言完成作答即可):
![]() | ![]() | ![]() |
int *MusicOrder(int chapter_len, int M, int *X_sorted, int *X_sorted_id, int *music_list)函式
int *MusicOrder(int chapter_len, int M, int *X_sorted, int *X_sorted_id, int *music_list) { return music_list; | public static int[] MusicOrder(int chapter_len, int M, int[] X_sorted, int[] X_sorted_id, int[] music_list)函式
public static int[] MusicOrder(int chapter_len, int M, int[] X_sorted, int[] X_sorted_id, int[] music_list) return music_list; | def MusicOrder(chapter_len, X_sorted, X_sorted_id)函式
def MusicOrder(chapter_len, X_sorted, X_sorted_id): # 回傳該單元的音樂播放清單 |
測資
範例測資:
測資1
輸入
1
800
輸出
780
780
780
780
測資2
輸入
2
300 300
輸出
2 1 180
780
780
780
測資3
輸入
5
60 100 200 300 400
輸出
5 4 1 20
3 2 480
780
780
測資4
輸入
5
638 527 416 354 223
輸出
1 142
2 5 30
3 4 10
780
測資5
輸入
10
272 623 226 398 452 328 705 646 172 763
輸出
10 17
7 75
8 134
2 157
1 | def MusicOrder(chapter_len, X_sorted, X_sorted_id): # 回傳該單元的音樂播放清單 |
第四題
剛成為大一新鮮人的王小明要開始選課了,他想把課程全部排在三天內,其他時間去打工與參加社團。因此他先列出三天內可以選的課程清單,決定使用以下規則輕鬆選課:
- 從第一天開始挑選,挑選完後,再挑選下一天的課程。
- 依照當天課程之下課節次排序,先挑選最早下課者(如有相同下課時間的課程,則選擇英文字母排序較前者, 例如:A為2-3節,B為1-3節,會選擇A)。
- 每日盡可能把課程排滿。
- 課程時間不可重疊。
- 同一天不會有重複的課程名稱,且相同課程在三天內只能挑選一次。
例如王小明挑選的三天課表為下表:
第一天選的課程是A、C (B的時間與A重疊、D的時間與C 重疊)
第二天選的課程是B、D(A選過了,E的時間與D 重疊)
第三天選的課程是F (C選過了,E的時間與F 重疊)
輸入格式:
未排序的課程清單
- N:共有幾筆資料輸入,其中N 為整數,3≤N ≤36
- d1 c1 s1 e1:天(1-3) 課程名稱(A-L) 課程開始節次(1-7) 課程結束節次(2-8)
- d2 c2 s2 e2:天(1-3) 課程名稱(A-L) 課程開始節次(1-7) 課程結束節次(2-8)
- ...
- dn cn sn en:天(1-3) 課程名稱(A-L) 課程開始節次(1-7) 課程結束節次(2-8)
輸出格式:
- d1 c1 s1 e1
- d2 c2 s2 e2
- ...
- dn cn sn en
需要完成及繳交的函式(擇一程式語言完成作答即可):
![]() | ![]() | ![]() | ![]() |
static void SelectCourse(Course[] results, bool[] selected, Course[] candidates, int cs)函式
static void SelectCourse(Course[] results, bool[] selected, Course[] candidates, int cs) { | void SelectCourse(Course results[], int *rs, bool selected[], Course candidates[], int cs)函式
void SelectCourse(Course results[], int *rs, bool selected[], Course candidates[], int cs) { | static void SelectCourse(Course results[], boolean selected[], Course candidates[], int cs)函式
static void SelectCourse(Course results[], boolean selected[], Course candidates[], int cs) { | def selectCourse(candidates, selected):函式
def selectCourse(candidates, selected): |
測資
範例測資:
測資1
輸入
11
2 D 5 7
3 C 2 3
1 C 5 6
2 E 7 8
1 B 2 4
2 A 5 6
3 E 5 7
1 D 6 8
1 A 1 2
3 F 5 6
2 B 1 4
輸出
1 A 1 2
1 C 5 6
2 B 1 4
2 D 5 7
3 F 5 6
測資2
輸入
10
1 A 1 3
1 B 3 6
1 C 5 7
2 A 2 4
2 B 5 7
2 E 3 5
3 B 6 8
3 D 3 5
3 C 4 6
3 F 5 7
輸出
1 A 1 3
1 C 5 7
2 E 3 5
3 D 3 5
3 B 6 8
測資3
輸入
12
1 A 1 3
2 B 2 5
3 C 3 5
1 B 4 6
2 E 5 8
3 F 3 5
2 C 1 3
2 D 4 6
2 F 3 5
1 C 5 8
2 G 7 8
3 D 6 8
輸出
1 A 1 3
1 B 4 6
2 C 1 3
2 D 4 6
2 G 7 8
3 F 3 5
測資4
輸入
9
1 A 1 3
2 B 3 4
3 C 4 6
2 C 5 7
2 D 6 8
3 F 4 6
1 B 6 8
2 F 3 5
3 E 1 3
輸出
1 A 1 3
1 B 6 8
2 F 3 5
2 D 6 8
3 E 1 3
3 C 4 6
測資5
輸入
8
1 D 1 3
1 E 4 6
2 A 1 3
2 B 2 4
3 B 5 7
3 E 4 6
1 C 3 5
2 C 6 8
輸出
1 D 1 3
1 E 4 6
2 A 1 3
2 C 6 8
3 B 5 7
1 | using System; |
1 | def selectCourse(candidates, selected): |
第五題
佇列(Queue)具備先進先出(first in first out, FIFO)的特性,廣泛的使用於需要排隊機制的應用中。請完成環形佇列函式circular_queue ( )來輔助進行廣度優先搜尋的功能。
本題主程式將透過廣度優先搜尋(Breadth First Search, BFS)法,從下圖中某一節點開始搜尋,搜尋過程中每一節點會依序透過 circular_queue( )函式放入佇列或自佇列中取出。
輸入格式:
- P:廣度優先搜尋的起點節點 (0-9)
輸出格式:
- p1 p2 … p9:廣度優先搜尋依序輸出節點
例如
若從節點4開始搜尋,環狀佇列的變化如下所示:
[0] [1] [2] [3] [4] [5]
4
1 3 5 6
2 3 5 6 0
2 5 6 0
2 7 6 0
2 7 8 0
2 7 8
7 8
8 9
9
輸出
4 1 3 5 6 0 2 7 8 9
需要完成及繳交的函式(擇一程式語言完成作答即可):
![]() | ![]() | ![]() |
public static void circular_queue(char c, int y)函式
public static void circular_queue(char c, int y) { | void circular_queue (char c, int* x )函式
void circular_queue (char c, int* x ){ | public static void circular_queue(char c, int y)函式
public static void circular_queue(char c, int y) { |
測資
範例測資:
測資1
輸入
1
輸出
1
0
2
4
3
8
5
6
9
7
測資2
輸入
3
輸出
3
0
4
5
1
6
7
2
8
9
測資3
輸入
5
輸出
5
3
4
6
7
0
1
8
9
2
測資4
輸入
7
輸出
7
5
6
9
3
4
8
0
1
2
測資5
輸入
9
輸出
9
7
8
5
6
2
3
4
1
0
1 | using System; |