已知 n 个考生的 3 门分数,算出平均分,分别对这四个分数进行降序排序,因此每个考生有 4 个排名。给出 m 个查询 id,输出当前 id 最好的排名以及其对应的科目名称,如果名次相同,按照 A > C > M > E 的优先级输出。若 id 不存在,输出 N/A 。
- 结构体存储学生的 id 、四门成绩及排名、最好的排名的对应的科目下标
- 存储的时候就按照 A > C > M > E 的优先级存储,可以简化后续步骤
- exist 数组负责检验当前 id 是否存在 ( != 0 ),exist [ id ] 的值为结构体数组 stu [ ] 中 id 对应结构体的下标 + 1 。
注:排名并列应该1、1、3、4、5,而不是1、1、2、3、4
#include<iostream>
#include<algorithm>
using namespace std;
struct student{
int id,best;
int sorce[4],rank[4];
}stu[2001];
int exist[1000000]={0},flag;
char c[5]="ACME";
bool cmp(student a,student b){
return a.sorce[flag] > b.sorce[flag];
}
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].sorce[1],&stu[i].sorce[2],&stu[i].sorce[3]);
stu[i].sorce[0] = (stu[i].sorce[1] + stu[i].sorce[2] + stu[i].sorce[3]) / 3.0 + 0.5;
}
for(flag=0;flag<=3;flag++){
sort(stu,stu+n,cmp);
stu[0].rank[flag] = 1;
for(int i=1;i<n;i++){
stu[i].rank[flag] = i + 1;
if(stu[i].sorce[flag] == stu[i-1].sorce[flag])
stu[i].rank[flag] = stu[i-1].rank[flag];
}
}
for(int i=0;i<n;i++){
exist[stu[i].id] = i + 1;
stu[i].best = 0;
int minbest = stu[i].rank[0];
for(int j=1;j<=3;j++){
if(stu[i].rank[j] < minbest){
minbest = stu[i].rank[j];
stu[i].best = j;
}
}
}
int id;
for(int i=0;i<m;i++){
scanf("%d",&id);
if(exist[id] == 0) printf("N/A\n");
else{
int k = stu[exist[id]-1].best;
printf("%d %c\n",stu[exist[id]-1].rank[k],c[k]);
}
}
}