1. 程式人生 > >PAT 甲級 A1012 (2019/02/15)

PAT 甲級 A1012 (2019/02/15)

ostream bsp char 枚舉 數學 sort %d 計算 查詢

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 struct Stu_info{
 6     int id;           //存放 id 的六位整數
 7     int score[4];     //存放 C M E A 的(分數)數組 
 8 }stu[2010];
 9 char course[4] = {A, C, M, E};         //將平均分A存在course[0]中,便於枚舉 
10 int Rank[10000000][4] = {0}, now; 11 bool cmp(Stu_info a, Stu_info b){ 12 /* 升序排列,如果改為 return a>b; 則為降序 */ 13 return a.score[now] > b.score[now]; 14 } 15 int main(){ 16 int m, n; 17 scanf("%d%d", &m, &n); 18 for(int i = 0; i < m; i++){ 19 /*
依次讀入 id C M E, 且計算品均分 A */ 20 scanf("%d%d%d%d", &stu[i].id, &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]); 21 stu[i].score[0] = (stu[i].score[1] + stu[i].score[2] + stu[i].score[3]) / 3; 22 } 23 for(now = 0; now < 4; now++){ 24 /*
now = 0; 時,對 平均分 A 從大到小排序 25 now = 1; 時,對 C C 從大到小排序 26 now = 2; 時,對 數學 M 從大到小排序 27 now = 3; 時,對 英語 E 從大到小排序 */ 28 sort(stu, stu + m, cmp); 29 /* 排完序號,將分數最高的設置為 1 */ 30 Rank[stu[0].id][now] = 1; 31 for(int i = 1; i < m; i++){ 32 if(stu[i].score[now] == stu[i-1].score[now]){ 33 /* 若與前一位考生分數相同,則他們的排名相同 */ 34 Rank[stu[i].id][now] = Rank[stu[i-1].id][now]; 35 }else{ 36 /* 否則,為其設置正確的排名 */ 37 Rank[stu[i].id][now] = i + 1; 38 } 39 } 40 } 41 int query; //查詢的考生 id 42 for(int i = 0; i < n; i++){ 43 scanf("%d", &query); 44 if(Rank[query][0] == 0){/* 如果查詢不到,則 N/A */ 45 printf("N/A\n"); 46 }else{ /* 否則,輸出他們的信息 */ 47 int k = 0; 48 for(int j = 0; j < 4; j++){ 49 if(Rank[query][j] < Rank[query][k]){ 50 /* j = 0; 查詢 Rank[query][0] 的值,最小的即為排名; 51 以此類推,得到其他同學的各科排名 52 */ 53 k = j; 54 } 55 } 56 printf("%d %c\n", Rank[query][k], course[k]); 57 } 58 } 59 return 0; 60 }

PAT 甲級 A1012 (2019/02/15)