PAT_甲级_1012 The Best Rank (25分) (C++) 【排序+结构体应用】

目录

1,题目描述

题目大意

输入

输出

2,思路

关键点

3,代码


1,题目描述

Sample Input:

5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999

Sample Output:

1 C
1 M
1 E
1 A
3 A
N/A

题目大意

给出每个学生(对应ID)的C(程序设计)、M(数学)、E(英语)成绩(可以计算出A:平均分),要求给出前来查成绩的同学最好的一项,输出排名以及该项的代号。

输入

学生总数N 查询成绩的人数M

各学生的成绩

查成绩的学生ID

输出

查成绩的同学对应的最优成绩排名 该项的代号

2,思路

输入学生的分数数据,并计算平均值;

先后按照A C M E来对stu结构体数组进行排序,并获得学生ID在这四个方面的排名;

遍历stu结构体数组,为exist数组赋值,并且得到该学生最优排名项目下标;

处理后来m个查询;

关键点

  1. 学生ID为6位数字,可以考虑int类型,并声明足够大的数组,以ID为下标;
  2. 设计数据结构,存储输入数据:设计结构体,存放string ID,int score[4],int rank[4], int best;
  3. 对成绩排序:使用sort函数(头文件:algorithm),自定义比较方法(函数),比如                                                                      bool cmp(node a, node b) {return a.score[flag] > b.score[flag];}                                                                                                        sort(stu, stu + n, cmp)
  4. 如何判断学生ID是否存在:可采用极端手法,声明规模为1000 000的整型数组exist,直接学生的ID作为数组下标进行查找,-1不存在,否则存在,且数组中存储的内容为stu中此ID的下标
  5. 注意优先级:A>C>M>E;
  6. 若出现重复的排名时,例如, 应为1 1 3 4 5,而不是1 1 2 3 4;

3,代码

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

struct node{
    int ID, best;
    int score[4], rank[4];
} stu[2020];

int flag = -1;                                                      //全局变量 指明按哪种成绩排序
bool cmp1(node a, node b) {return a.score[flag] > b.score[flag];}   //函数 自定义比较方式 用于排序
int exist[1000000];                                                 //以id为下标 存放该学生在stu中的位置

int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif

    int n, m, C, M, E, A;
    int id;
    char ch[4] = {'A', 'C', 'M', 'E'}; //注意优先级!A>C>M>E
    cin>>n>>m;

    for(int i = 0; i < n; i++){
        cin>>id>>C>>M>>E;
        stu[i].ID = id;
        stu[i].score[1] = C;stu[i].score[2] = M;stu[i].score[3] = E;//注意优先级!
        stu[i].score[0] = (C + M + E) / 3;     //不需要四舍五入
    }

    //分别按A C M E对学生进行排序
    for(flag = 0; flag < 4; flag++){
        sort(stu, stu + n, cmp1);                           //排序
        for(int i = 0; i < n; i++){                         //赋值
            stu[i].rank[flag] = i + 1;
            if(stu[i].score[flag] == stu[i-1].score[flag]){ //分数相等则排名相同
                stu[i].rank[flag] = stu[i-1].rank[flag];
            }
        }
    }

    memset(exist, -1, sizeof(exist));
    //fill(exist.begin(), exist.end(), -1);
    for(int i = 0; i < n; i++){
        exist[stu[i].ID] = i;                               //将最后一次排序完成后 学生ID对应stu的位置 赋值到exist数组中
        int minRank = 100;
        for(int j = 0; j < 4; j++){                         //计算最优排名
            if(minRank > stu[i].rank[j]){
                minRank = stu[i].rank[j];
                stu[i].best = j;
            }
        }

    }

    for(int i = 0; i < m; i++){
        cin>>id;
        if(exist[id] == -1){
            cout<<"N/A"<<endl;
        }else{
            int index = exist[id];
            int best = stu[index].best;
            cout<<stu[index].rank[best]<<' '<<ch[best]<<endl;
        }
    }

    return 0;
}
发布了45 篇原创文章 · 获赞 5 · 访问量 2189

猜你喜欢

转载自blog.csdn.net/qq_41528502/article/details/104220493
今日推荐