PAT 1012 The Best Rank

1012 The Best Rank

To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: C - C Programming Language, M - Mathematics (Calculus or Linear Algrbra), and E - English. At the mean time, we encourage students by emphasizing on their best ranks -- that is, among the four ranks with respect to the three courses and the average grade, we print the best rank for each student.

For example, The grades of CME and A - Average of 4 students are given as the following:

StudentID  C  M  E  A
310101     98 85 88 90
310102     70 95 88 84
310103     82 87 94 88
310104     91 91 91 91

Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average.

Input Specification:

Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (≤2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of CM and E. Then there are M lines, each containing a student ID.

Output Specification:

For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space.

The priorities of the ranking methods are ordered as A > C > M > E. Hence if there are two or more ways for a student to obtain the same best rank, output the one with the highest priority.

If a student is not on the grading list, simply output N/A.

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

代码:

学到的东西:

像这题,题目要求求出每一门成绩的排名(结构体存储名字,各科成绩),这是需要用到排序的但是直接使用排序是不能将每一科的成绩都进行排名的,可以把各个科目的成绩存在一个数组中,在对每一科进行排名时,用flag表示当前正在排名哪一个科目,cmp函数也可以直接对score数组中国的第flag门进行排序,最后得到每一门成绩的排名

#include <iostream>
#include <algorithm>
using namespace std;

const int N=2010;
int exist[1000000];
int flag=-1;
int n,m;

struct stu{
    int name,best;//best存的是这位同学最好的成绩排名的下标,表示哪一门科目
    int score[4],rank[4];//score表示每一门的成绩,rank表示每一门的排名
}s[N];

bool cmp(stu a,stu b){
    return a.score[flag]>b.score[flag];
}

int main(){
    cin >> n >> m;
    
    for(int i=0;i<n;i++){
        scanf("%d%d%d%d",&s[i].name,&s[i].score[1],&s[i].score[2],&s[i].score[3]);
        s[i].score[0]=(s[i].score[1]+s[i].score[2]+s[i].score[3])/3.0+0.5;
    }
    
    //将每一门成绩排名
    for(int i=0;i<4;i++){
        flag=i;//flag表示当前排序的是哪一门科目
        sort(s,s+n,cmp);
        s[0].rank[flag]=1;
        for(int j=1;j<n;j++){
            s[j].rank[flag]=j+1;
            if(s[j].score[flag]==s[j-1].score[flag])
                s[j].rank[flag]=s[j-1].rank[flag];
        }
    }
        
    //找到每一个人的排名
    //可以这样理解:为了避免多余的循环查找,利用一个数组将ID和对应结构体下标联系起来了,
    //数组下标表示ID,值表示对应的下标,这里还为了判断当前人是否存在,所以默认对应下标值0的人不存在
    for(int i=0;i<n;i++){
        exist[s[i].name]=i+1;//将id用数组表示,这样在后面判断需要查找的ID是否存在就不要用循环查找了
        //还有一个有点是,因为题目给出的是需要ID,需要找到这个ID对应的排名又是需要用到循环查找的,用exist数组还表示了对应ID在结构体中的下标
        s[i].best=0;
        int minn=s[i].rank[0];
        for(int j=1;j<4;j++){
            if(minn>s[i].rank[j]){
                minn=s[i].rank[j];
                s[i].best=j;
            }
        }
    }
    
    int id;
    char word[]={'A','C','M','E'};
    for(int i=0;i<m;i++){
        scanf("%d",&id);
        int temp=exist[id];
        if(temp){
            int best=s[temp-1].best;
            printf("%d %c\n",s[temp-1].rank[best],word[best]);
        }
        else printf("N/A\n");
    }
    
    return 0;
}

 好好学习,天天向上!

我要考研!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值