题目大意:现已知n个考生的3门分数,平均分可以按照这三门算出来。然后分别对这四个分数从高到低排序,这样对每个考生来说有4个排名。k个查询,对于每一个学生id,输出当前id学生的最好的排名和它对应的分数,如果名次相同,按照A>C>M>E的顺序输出。如果当前id不存在,输出N/A 思路:
先定义个结构体,里面包含了一个分数的数组和对应排名的数组。输入后进行排序,排序后存到对应排名的数组中。查询的时候还要对查询的人调选排名最高的名词和分数输出,用比较就行了。注意排名相等的时候优先输出顺序。 ————————————————————————— #include<iostream> #include<algorithm> #include<math.h> using namespace std; struct student { int id; int grade[4]; }stu[2010]; int Rank[100000000][4] = { 0 }; char course[4] = {'A','C','M','E'}; int now = -1; bool cmp(student a,student b) { return a.grade[now] > b.grade[now]; } int main() { int n, m; cin >> n >> m; for (int i = 0; i < n; i++) { cin >> stu[i].id >> stu[i].grade[1] >> stu[i].grade[2] >> stu[i].grade[3]; stu[i].grade[0] = stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3]; } for (now = 0; now < 4; now++) //四门成绩 { sort(stu, stu+ n, cmp); Rank[stu[0].id][now] = 1; for (int j = 1; j < n; j++) //所有同学间比较 { if (stu[j].grade[now] == stu[j-1].grade[now]) Rank[stu[j].id][now] = Rank[stu[j - 1].id][now]; else Rank[stu[j].id][now] = j + 1; } } int query; //查询考生的ID for (int i = 0; i < m; i++) { cin >> query; if (Rank[query][0] == 0) cout << "N/A" << endl; else { int k = 0; for (int j = 0; j < 4; j++) { if (Rank[query][j] < Rank[query][k]) { k = j; } } cout << Rank[query][k] << " " << course[k] << endl; } } }