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
");
    else
    {
      int k=0;
      for(int j=0 ; j<4 ; ++j)
        if(Rank[query][j]<Rank[query][k])    //枚举这个学号的所有科目排名,最考前的保存在k中
          k=j;
      printf("%d %c
",Rank[query][k],course[k]);
    }
  }
  return 0;
}
原文地址:https://www.cnblogs.com/Evence/p/4300469.html