返回目录
题意
输入n个学生的id和课程C、M和E的分数,求平均成绩A,对每门课和平均成绩进行排序,再输入m个id进行查询,如果该学生没有信息,则输出N/A,否则输出它的4个排名中最靠前的,如果有成绩排名相同,则按照A>C>M>E的顺序进行输出
样例(可复制)
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
样例输出
1 C
1 M
1 E
1 A
3 A
N/A
注意点
- 本题也是典型的排序问题
- 使用Rank单独保存每门课程和平均成绩的排名,这样查询时就不需要遍历查询,防止超时
- 本题使用总成绩代替了平均成绩,这样免去了取整或四舍五入操作
- id设为整形而不设成字符串是方便使用散列思想进行查询
- 注意成绩为90 80 80 80 70的排名应该算成1 2 2 2 5,而非1 2 2 2 3
#include <bits/stdc++.h>
using namespace std;
struct student{
int id;
int grade[4];
}stu[2010];
char course[4]={'A','C','M','E'};
int Rank[1000000][4]={0};
int now;//定义为全局变量方便函数cmp传参数
bool cmp(student a,student b){
return a.grade[now]>b.grade[now];
}
int main(){
int n,m;
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&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];
}
//对4门课程分别进行排序,结果存在Rank里
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].grade[now]==stu[i-1].grade[now])
Rank[stu[i].id][now]=Rank[stu[i-1].id][now];
else
Rank[stu[i].id][now]=i+1;
}
}
while(m--){
int id;
scanf("%d",&id);
if(Rank[id][0]==0){
printf("N/A\n");
continue;
}
int mark=0;
for(int i=0;i<4;i++){
if(Rank[id][i]<Rank[id][mark])mark=i;
}
printf("%d %c\n",Rank[id][mark],course[mark]);
}
return 0;
}