问题:
- 这个题和以前题不同之处在于每个学生有多个要排序的数据,如果分别用4个变量表示,就要写4个cmp函数。如果用一个数组+now变量,一个cmp函数就可以了。
- 并没有将排名放入结构体中,由于要查询id对应的排名,就另外用了一个二维数组Rank[1000000][4]来记录,这样就可以随机访问了。
- 由于各门成绩的排名之间有优先级,于是记录分数和排名的数组就按优先级来顺序记录。在最后查找最高排名时,从前往后顺序查找,用k记录下标,这样当多个最高排名相同是,自然记录的就是优先级最高的那个。
结构体内容,排名怎么记录,cmp函数
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct student{
int id;//存放6位整数的id
int grades[4];//存放4个分数
} stu[2010];
char course[4] = {'A', 'C', 'M', 'E'};//按优先级顺序,方便输出
int Rank[1000000][4] = {0};//Rank[id][0]~Rank[id][3]为四门课对应的排名
int now;//cmp函数中使用,表示当前按now号分数排序stu数组
bool cmp(student s1,student s2){//数组 + now这样就不用写4个cmp函数了
return s1.grades[now] > s2.grades[now];
}
int main(){
int n, m;
scanf("%d%d", &n, &m);
for (int i = 0; i < n;i++){
//读入分数,其中grades[0]~grades[3]分别代表A,C,M,E
scanf("%d%d%d%d", &stu[i].id, &stu[i].grades[1], &stu[i].grades[2], &stu[i].grades[3]);
stu[i].grades[0] = stu[i].grades[1] + stu[i].grades[2] + stu[i].grades[3];
}
for (now = 0; now < 4;now++){
sort(stu, stu + n, cmp);
Rank[stu[0].id][now] = 1;
for (int i = 1; i < n;i++){
if(stu[i].grades[now] == stu[i-1].grades[now])
Rank[stu[i].id][now] = Rank[stu[i - 1].id][now];
else
Rank[stu[i].id][now] = i + 1;
}
}
int query;//查询id
for (int i = 0; i < m;i++){
scanf("%d", &query);
if(Rank[query][0]==0)
printf("N/A\n");
else{
int k = 0;
for (int j = 1; j < 4;j++){
if(Rank[query][j]<Rank[query][k])
k = j;
}
printf("%d %c\n", Rank[query][k], course[k]);
}
}
return 0;
}