PAT:1012. The Best Rank (25) AC
#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;
}