# APCS程式設計實作題 **第1題 成績指標** :::success ![](https://i.imgur.com/ywAqg4W.png) ::: ```cpp= #include <iostream> #include <algorithm>//for sort #define MAX 20+5//最大的學生數 using namespace std; int scores[MAX]; //儲存所有輸入學生的分數 int main() { int people; //儲存輸入的學生人數(第一行輸入資料) cin>>people; //輸入學生人數 //連續讀取 n個學生的分數(第二行) //分別儲存 scores 陣列 for(int i=0; i<people; i++) { //將讀取的資料存入 scores[i] //第i個學生人數 cin>>scores[i]; } //將分數由小到大排序 sort(scores, scores+people); //第一行由小而大 印出所有成績,兩數字之間以一個空白格隔開 int firat = 1; for(int i=0; i<people; i++) { if(firat) { cout<<scores[i]; firat = 0; } else { cout<<" "<<scores[i]; } } cout<<"\n"; //代表不及格最高分 //-1:代表沒有不及格的 int b60 = -1; for(int i=0; i<people; i++) { if(scores[i]<60) b60=scores[i]; } if(b60==-1) cout<<"best case\n"; else cout<<b60<<"\n"; //代表不及格最高分 //-1:代表沒有不及格的 b60 = -1; for(int i=people-1; i>=0; i--) { if(scores[i]>=60) b60=scores[i]; } if(b60==-1) cout<<"worst case\n"; else cout<<b60<<"\n"; return 0; } ``` :::info **驗證1** ![](https://i.imgur.com/moNsYwV.png) ![](https://i.imgur.com/klmlsa0.png) ::: :::warning **驗證2** ![](https://i.imgur.com/LZAAP1O.png) ![](https://i.imgur.com/Dvvsneu.png) ::: ```cpp= #include <iostream> #include <algorithm>//for sort #define MAX 20+5//最大的學生數 using namespace std; int scores[MAX]; //儲存所有輸入學生的分數 #define LOCAL //本機電腦測試 #include<cstdio> int main() { #ifdef LOCAL freopen("data.inp", "r", stdin); freopen("data.out", "w", stdout); #endif // LOCAL int people; //儲存輸入的學生人數(第一行輸入資料) while(cin>>people)//輸入學生人數 { //連續讀取 n個學生的分數(第二行) //分別儲存 scores 陣列 for(int i=0; i<people; i++) { //將讀取的資料存入 scores[i] //第i個學生人數 cin>>scores[i]; } //將分數由小到大排序 sort(scores, scores+people); //第一行由小而大 印出所有成績,兩數字之間以一個空白格隔開 int firat = 1; for(int i=0; i<people; i++) { if(firat) { cout<<scores[i]; firat = 0; } else { cout<<" "<<scores[i]; } } cout<<"\n"; //代表不及格最高分 //-1:代表沒有不及格的 int b60 = -1; for(int i=0; i<people; i++) { if(scores[i]<60) b60=scores[i]; } if(b60==-1) cout<<"best case\n"; else cout<<b60<<"\n"; //代表不及格最高分 //-1:代表沒有不及格的 b60 = -1; for(int i=people-1; i>=0; i--) { if(scores[i]>=60) b60=scores[i]; } if(b60==-1) cout<<"worst case\n"; else cout<<b60<<"\n"; } return 0; } ``` ![](https://i.imgur.com/JjVrpnV.png) ![](https://i.imgur.com/HgS4uYt.png) 第三題 :::success ![](https://i.imgur.com/sNreE2r.png) ::: 解法1(使用陣列,較差) ```cpp= #include <iostream> #include <cstring> // for memset() #include <cstdio> #define MAXM 10000000+10 // 最大線段座標 using namespace std; int lines[MAXM]; // 儲存所有座標 int main(){ int n; // 儲存輸入的線段數 (第一行) while(cin>>n){ memset(lines,0,sizeof(lines)); // 將lines的所有元素設為0 int st,ed; // 起點,終點 for(int i=0;i<n;i++){ // 讀取n筆線段資料 (第二行~結束) cin>>st>>ed; for(int j=st;j<ed;j++){ // 將起點到終點之間的元素設為1 lines[j]=1; } } int len=0; // line長度 for(int i=0;i<MAXM;i++){ // 計算len (lines內元素總和) len+=lines[i]; } cout<<len<<"\n"; // 輸出 } return 0; } ``` 解法2(使用自訂結構,較佳) ```cpp= #include <iostream> #include <algorithm> //for sort() #include <cstdio> //for freopen() #define MAXN 10000+10 //最多line數 #define LOCAL // for local testing using namespace std; //定義線段結構 typedef struct _line { int start; //線段起點 int end; //線段終點 }LINE; //自訂struct _line的資料型態為LINE //宣告儲存所有線段的LINE結構陣列 LINE lines[MAXN]; //起點小的排前面 //起點相同終點小的排前面 int cmp(LINE p, LINE q) { if(p.start==q.start) return p.end<q.end; else return p.start<q.start; } int main() { #ifdef LOCAL freopen("data3.inp","r", stdin); freopen("data3.out","w", stdout); #endif //LOCAL int n; //輸入的線段數 while(cin>>n) { //將n筆線段起點與終點 存入 for(int i=0; i<n; i++) { //第i筆線段的起點與終點存入 cin>>lines[i].start>>lines[i].end; } //有小到大排序(自訂排序準則) sort(lines, lines+n, cmp); //計算線段長度 int st, ed, lens = 0; for(int i=0; i<n; i++) { st = lines[i].start; //第i個線段的起點 ed = lines[i].end; //第i個線段的終點 //判斷下一個線段(i+1)是否與目前的線段(i)重疊 while((i+1)<n && lines[i+1].start<ed) { //完全重疊 if(lines[i+1].end<=ed) i++; //移到下一個線段 else //部分重疊 { ed = lines[i+1].end; //將下一個線段的終點設為目前的終點 i++; //移到下一個線段 } } //加入線段長度 lens+=ed-st; } //輸出結果 cout<<lens<<"\n"; } return 0; } ```