# 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。

一個矩陣A可以經過一連串的旋轉與翻轉操作後,轉換成新矩陣B。如圖二中,A經過翻轉與兩次旋轉後,可以得到B。給定矩陣B和一連串的操作請算出原始的矩陣A。

### 輸入格式
第一行有三個介於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
(說明)

### 評分說明
輸入包含若干筆測試資料,每一筆測試資料的執行時間限制(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;
}
```