#include<stdio.h> #include<algorithm> using namespace std; struct Student { int mID; int grade[4]; //0对应平均A,1对应C,2对应M,3对应E }STU[2010]; char course[4]={‘A‘,‘C‘,‘M‘,‘E‘}; //所有的存储都对应ACME int Rank[10000000][4]={0}; //每个学号四个成绩对应的排名 int now=0; //排序的时候按now这门课排 bool cmp(Student a,Student b) { return a.grade[now]>b.grade[now]; //按照第now个成绩进行排序【warning】这里要按now成绩从大到小排列,写“<”勿写“>” } int main() { int n,m; scanf("%d%d",&n,&m); //n个输入,m个查询 for(int i=0 ; i<n ; ++i) { scanf("%d%d%d%d",&STU[i].mID ,&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; } for(now=0 ; now<4 ; ++now) //对于每一门课都按now进行排序,并将排名记录在Rank中 { sort(STU,STU+n,cmp); Rank[STU[0].mID][now]=1; //排序后结构体第一个为now标准下的第一名 for(int i=1 ; i<n ;++i) if(STU[i].grade[now]==STU[i-1].grade[now]) //分数相同,并列排名【思维】:和前一个排名相同,不同则i+1 Rank[STU[i].mID][now]=Rank[STU[i-1].mID][now]; else Rank[STU[i].mID][now]=i+1; } int query; for(int i=0 ; i<m ; ++i) { scanf("%d",&query); if(Rank[query][0]==0) //排名一定是1,2,3……,出现的时候,这个学号肯定有问题 printf("N/A\n"); else { int k=0; for(int j=0 ; j<4 ; ++j) if(Rank[query][j]<Rank[query][k]) //枚举这个学号的所有科目排名,最考前的保存在k中 k=j; printf("%d %c\n",Rank[query][k],course[k]); } } return 0; }
时间: 2024-08-25 07:30:44