# APCS 題目解析 105.03.05 ## 題目1-成績指標 ### 關鍵指令 * array、sort ### 關建方法 * 找出最大、最小值 --- ### 問題描述 一次考試中,於所有及格學生中獲取最低分數者最為幸運,反之,於所有不及格同學中,獲取最高分數者,可以說是最為不幸,而此二種分數,可以視為成績指標。 請你設計一支程式,讀入全班成績(人數不固定),請對所有分數進行排序,並分別找出不及格中最高分數,以及及格中最低分數。 當找不到最低及格分數,表示對於本次考試而言,這是一個不幸之班級,此時請你印出:「worst case」;反之,當找不到最高不及格分數時,請你印出「best case」。 ---- 註:假設及格分數為 60,每筆測資皆為 0~100 間整數,且筆數未定。 ### 輸入格式 第一行輸入學生人數,第二行為各學生分數(0~100 間),分數與分數之間以一個空白間格。每一筆測資的學生人數為 1~20 的整數。 ---- ### 輸出格式 每筆測資輸出三行。 第一行由小而大印出所有成績,兩數字之間以一個空白間格,最後一個數字後無空白; 第二行印出最高不及格分數,如果全數及格時,於此行印出 best case; 第三行印出最低及格分數,當全數不及格時,於此行印出 worst case。 --- ### 範例一:輸入 10 0 11 22 33 55 66 77 99 88 44 #### 範例一:正確輸出 0 11 22 33 44 55 66 77 88 99 55 66 (說明)不及格分數最高為 55 ,及格分數最低為 66 。 ---- ### 範例二:輸入 1 13 #### 範例二:正確輸出 13 13 worst case (說明)由於找不到最低及格分,因此 第三行 須印出「 worst case 」。 ---- ### 範例三 :輸入 2 73 65 #### 範例三 :正確輸出 65 73 best case 65 (說明)由於找不到 不 及格分,因此 第二行 須印出「 best case 」。 ---- ### 評分說明 輸入包含若干筆測試資料,每一筆測試資料的執行時間限制(time limit)均為 2 秒,依正確通過測資筆數給分。 --- ### 參考程式碼 ```cpp= #include <iostream> #include <algorithm> using namespace std; int main() { long n; // 取得成積數量 cin >> n; int arr[n]; // 取得成績 for(int i = 0; i < n; i++) { cin >> arr[i]; } sort(arr, arr + n); // 排列順序 for(int i = 0; i < n; i++) { // 列出所有成績 cout << arr[i]; if (i < n - 1) cout << " "; } cout << endl; int max = -1; // 找最大值,先設定為-1 int min = 999; // 找最小值,先設定鴋為 999 for(int i = 0; i < n; i++) { if (arr[i] < 60 && arr[i] > max) max = arr[i]; if (arr[i] > 60 && arr[i] < min) min = arr[i]; } if(max == -1) cout << "best case" << endl; else cout << max << endl; if(min == 999) cout << "worst case"; else cout << min; } ``` --- ## 105.03.05-2-矩陣轉換 --- ### 問題描述 矩陣是將一群元素整齊的排列成一個矩形, 在矩陣中的橫排稱為列(row),直排稱為行(column),其中以 Xij 來表示 矩陣 X 中的第 i 列 第 j 行 的元素 。如圖一中, X32=6。 我們可以對矩陣定義 兩 種操作如下 * 翻轉:即第一列與最後一列交換、第二列與倒數第二列交換、依此類推。 * 旋轉:將矩陣以順時針方向轉 90 度。 例如:矩陣 X 翻轉後可得到 Y 將 矩陣 Y 再 旋轉後可得到 Z。 ![image](https://hackmd.io/_uploads/B1S6RPAS0.png) 一個矩陣A可以經過一連串的旋轉與翻轉操作後,轉換成新矩陣B。如圖二中,A經過翻轉與兩次旋轉後,可以得到B。給定矩陣B和一連串的操作請算出原始的矩陣A。 ![image](https://hackmd.io/_uploads/BkChy_AB0.png) ### 輸入格式 第一行有三個介於1與10之間的正整數R,C,M。接下來有R行(是矩陣B的內容,每一行line)都包含C個正整數,其中的第i行第j個數字代表矩陣Bij的值。在矩陣內容後的一行有M個整數,表示對矩陣A進行的操作。第k個整數mk代表第k個操作,如果mk=0則代表 旋轉 m k = 1 代表 翻轉 。 同一行的數字之間都是以一個空白間格 ,且矩陣內容為0~9的整數。 ### 輸出格式 輸出包含兩個部分。第一個部分有一行,包含兩個正整數R和C '',以一個空白隔開,分別代表矩陣A的列數和行數。接下來有R'行,每一行都包含C'個正整數,且每一行的整數 之 間以一個空白隔開 其中第 i 行的第 j 個數字代表矩陣Aij的值。每一行的最後一個數字後並無空白。 ### 範例一:輸入 3 2 3 1 1 3 1 1 2 1 0 0 #### 範例一:正確輸出 3 2 1 1 1 3 2 1 (說明)如圖二 所示 ### 範例二:輸入 3 2 2 3 3 2 1 1 2 0 1 #### 範例二:正確輸出 2 3 2 1 3 1 2 3 (說明) ![image](https://hackmd.io/_uploads/Bklpzd0S0.png) ### 評分說明 輸入包含若干筆測試資料,每一筆測試資料的執行時間限制(time limit)均為2秒, 依正確通過測資筆數給分。其中: 第一子題組共30分其每個操作都是翻轉。 第二子題組共70分操作有翻轉也有旋轉。 ---- ### 參考程式碼 ```cpp= #include <iostream> using namespace std; int main() { long r, c, m; cin >> r; cin >> c; cin >> m; int arr[r][c]; int inv[c][r]; for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { cin >> arr[i][j]; } } int matrix[m]; for(int i = 0; i < m; i++) { cin >> matrix[i]; } bool inverse = 0; for(int k = 0; k < m; k++) { if (matrix[k] == 0) { if (inverse) { for(int i = 0; i < c; i++) { for(int j = 0; j < r; j++) { arr[r - j - 1][i] = inv[i][j]; } } } else { for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { inv[c - j - 1][i] = arr[i][j]; } } } inverse = 1 - inverse; } else { if (inverse) { for(int i = 0; i < r; i++) { for(int j = 0; j < c / 2; j++) { swap(inv[j][i], inv[c - j - 1][i]); } } } else { for(int i = 0; i < c; i++) { for(int j = 0; j < r / 2; j++) { swap(arr[j][i], arr[r - j - 1][i]); } } } } } if (inverse) { cout << c << " " << r << endl; for(int i = 0; i < c; i++) { for(int j = 0; j < r; j++) { cout << inv[i][j]; if (j < r - 1) cout << " "; if (j == r - 1) cout << endl; } } } else { cout << r << " " << c << endl; for(int i = 0; i < r; i++) { for(int j = 0; j < c; j++) { cout << arr[i][j]; if (j < c - 1) cout << " "; if (j == c - 1) cout << endl; } } } cout << endl; } ```