PAT_1012.The Best Rank

// 1012_The Best Rank.cpp : 定义控制台应用程序的入口点。
//1012. The Best Rank (25)
//
//时间限制
//400 ms
//内存限制
//65536 kB
//代码长度限制
//16000 B
//判题程序
//Standard
//作者
//CHEN, Yue
//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 Algebra), 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 C, M, E 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
//
//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 C, M and E. Then there are M lines, each containing a student ID.
//
//Output
//
//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


#include "stdafx.h"
#include "stdio.h"
#include "iostream"
#include "string.h"
#include "stdlib.h"
#include "string"
#include "algorithm"
using namespace std;

struct student{
    char id[20];
    int c,m,e;
    float a;
    int rank_c,rank_m,rank_e,rank_a;
}stu[2010];

bool cmp_c(student a,student b){
    return a.c>b.c;
}
bool cmp_m(student a,student b){
    return a.m>b.m;
}
bool cmp_e(student a,student b){
    return a.e>b.e;
}
bool cmp_a(student a,student b){
    return a.a>b.a;
}

int main()
{
    int N,M;
    char id[20];
    cin>>N>>M;
    for(int i = 0;i<N;i++){
        cin>>stu[i].id>>stu[i].c>>stu[i].m>>stu[i].e;
        stu[i].a = (stu[i].c+stu[i].m+stu[i].e) * 1.0/3;
    }

    int last_rank ,last_score;

    sort(stu,stu+N,cmp_c);
    stu[0].rank_c = 1;
    last_rank = stu[0].rank_c;
    last_score = stu[0].c;
    for(int i = 1;i<N;i++){
        if(stu[i].c<last_score){
            stu[i].rank_c = i+1;
            last_score = stu[i].c;
            last_rank = i+1;
        }
        else{              //分数相等
            stu[i].rank_c = last_rank;
        }
    }

    sort(stu,stu+N,cmp_m);
    stu[0].rank_m = 1;
    last_rank = stu[0].rank_m;
    last_score = stu[0].m;
    for(int i = 1;i<N;i++){
        if(stu[i].m<last_score){
            stu[i].rank_m = i+1;
            last_score = stu[i].c;
            last_rank = i+1;
        }
        else{              //分数相等
            stu[i].rank_m = last_rank;
        }
    }

    sort(stu,stu+N,cmp_e);
    stu[0].rank_e = 1;
    last_rank = stu[0].rank_e;
    last_score = stu[0].e;
    for(int i = 1;i<N;i++){
        if(stu[i].e<last_score){
            stu[i].rank_e = i+1;
            last_score = stu[i].e;
            last_rank = i+1;
        }
        else{              //分数相等
            stu[i].rank_e = last_rank;
        }
    }

    sort(stu,stu+N,cmp_a);
    stu[0].rank_a = 1;
    last_rank = stu[0].rank_a;
    last_score = stu[0].a;
    for(int i = 1;i<N;i++){
        if(stu[i].a<last_score){
            stu[i].rank_a = i+1;
            last_score = stu[i].a;
            last_rank = i+1;
        }
        else{              //分数相等
            stu[i].rank_a = last_rank;
        }
    }

    for(int i = 0;i<M;i++){
        cin>>id;
        int flag = 0;
        for(int i =0;i<N;i++){
            if(!strcmp(stu[i].id,id)){
                flag = 1;
                if(stu[i].rank_a<=stu[i].rank_c && stu[i].rank_a<= stu[i].rank_m && stu[i].rank_a<=stu[i].rank_e)
                    cout<<stu[i].rank_a<<" "<<"A"<<endl;
                else if(stu[i].rank_c<=stu[i].rank_m && stu[i].rank_c<=stu[i].rank_e)
                    cout<<stu[i].rank_c<<" "<<"C"<<endl;
                else if(stu[i].rank_m<=stu[i].rank_e)
                    cout<<stu[i].rank_m<<" "<<"M"<<endl;
                else
                    cout<<stu[i].rank_e<<" "<<"E"<<endl;
                break;
            }
        }
        if(!flag)
            cout<<"N/A"<<endl;
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值