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 }
原文地址:https://www.cnblogs.com/zjsaipplp/p/10415853.html
时间: 2024-11-06 03:55:38