• 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;
    }
  • 相关阅读:
    SELECT 的6大子句
    MySQL关联查询
    MySql常用函数
    自动升压降压充电模块 最高25.2V
    压力校准仪开发日志--2017-10-30-2
    动压和静压
    上海无人面馆
    皮托管
    SOC
    LDO
  • 原文地址:https://www.cnblogs.com/Evence/p/4300469.html
Copyright © 2020-2023  润新知