#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
using namespace std;
key:Rank[id][0]~Rank[id][4]为编号为id的考生四门课对应的排名,另:course[]数组分别存ACME
对结构体的理解,!4次排序 -for!,结构体内的grade是数组,排名相同则后者居"后"
注意这题cmp,now为全局变量,不用传参进去
struct Student{
int id; //存放6位整数的ID
int grade[4]; //存放4个数
}stu[2010];
char course[4]={'A','C','M','E'}; //按优先级顺序,方便输出
int Rank[10000000][4]={0}; //Rank[id][0]~Rank[id][4]为四门课对应的排名
int now; //cmp函数中使用,表示当前按now号分数排序stu数组
bool cmp(Student a,Student b){ //stu数组按now号分数递减排序
return a.grade[now] > b.grade[now] ;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
//读入分数,其中grade[0]~grade[3]分别代表A,C,M,E
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])/3.0+0.5; //四舍五入
//上面的这里我没用晴神的四舍五入方法(没看懂hhh)
}
for(now=0;now<4;now++){ //枚举A,C,M,E 4个中的一个
sort(stu,stu+n,cmp); //对所有考生按该分数从大到小排序
Rank[stu[0].id][now]=1; //排序完,将分数最高的设为rank1
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; //否则,为其设置正确的排名
}
}
}
int query; //查询的考生ID
for(int i=0;i<m;i++){
scanf("%d",&query);
if(Rank[query][0] == 0){
//如果这个考生ID不存在(这里看是否0分emm但是感觉考生可能考鸭蛋),则输出"N/A"
printf("N/A\n");
}else{
int k=0; //选出Rank[query][0~3]中最小的rank值最小,排名越高
for(int j=0;j<4;j++){
if(Rank[query][j] < Rank[query][k]) {
k=j;
}
}
printf("%d %c\n",Rank[query][k],course[k]);
}
}
system("pause");
return 0;
}
PS:看到有两个大佬用容器,先mark,此坑日后补上