1085. PAT单位排行 (25)

每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入格式:
输入第一行给出一个正整数N(<=105),即考生人数。随后N行,每行按下列格式给出一个考生的信息:
准考证号 得分 学校
其中“准考证号”是由6个字符组成的字符串,其首字母表示考试的级别:“B”代表乙级,“A”代表甲级,“T”代表顶级;“得分”是 [0,100] 区间内的整数;“学校”是由不超过6个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
输出格式:
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
排名 学校 加权总分 考生人数
其中“排名”是该单位的排名(从1开始);“学校”是全部按小写字母输出的单位码;“加权总分”定义为“乙级总分/1.5 + 甲级总分 + 顶级总分*1.5”的整数部分;“考生人数”是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。

————————————————————————————————
神奇的题目,坑点倒是没有,关键就是让一个学校名字对应一个序号
这里用到了C++ 的map,初学c++,请看代码,我的比较函数仍然用的C的方法
关键在于学校与序号的对应关系!!

有一个就是cout会超时printf就不会
查了一下
cout之所以效率低,是先把要输出的东西存入缓冲区,再输出,导致效率降低。
大小写的转换可以学习下~

还有一个C++中string的定义字符串,同样不能改变字符串内的字符,但却可以把另外一个字符串赋给它 本来写了个转换函数发现根本没变化

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
struct stu
{
    int yi,jia,ding,total,num;
    string name;
}item[100033];
int cmp(const void *a,const void *b){
    if((*(stu *)a).total!=(*(stu *)b).total){
        return (*(stu *)b).total-(*(stu *)a).total;
    }
    else if((*(stu *)a).num!=(*(stu *)b).num){
        return (*(stu *)a).num-(*(stu *)b).num;
    }
    else return ((*(stu *)b).name)<(*(stu *)a).name;
}
int main(){
    int t;
    cin>>t;
    map<string,int>mapSchool;
    int count=0;
    for (int i = 0; i < t; ++i)
    {
        string stuname;
        int grade;
        string school;
        cin>>stuname>>grade>>school;
        transform(school.begin(), school.end(),school.begin(), ::tolower);//学校转小写 #include 
        if(mapSchool[school]==0){
            mapSchool[school]=++count;//学校不存在则记录学校个数,并作为序号
            item[count].name=school;
            item[count].num++;
            if(stuname[0] =='T'){
                item[count].ding+=grade;
            }
            else if(stuname[0]=='B'){
                item[count].yi+=grade;
            }
            else if(stuname[0]=='A'){
                item[count].jia+=grade;
            }

        }
        else{
            item[mapSchool[school]].name=school;
            item[mapSchool[school]].num++;
            if(stuname[0] =='T'){
                item[mapSchool[school]].ding+=grade;
            }
            else if(stuname[0]=='B'){
                item[mapSchool[school]].yi+=grade;
            }
            else if(stuname[0]=='A'){
                item[mapSchool[school]].jia+=grade;
            }
        }
    }
    for(int i=1;i<=mapSchool.size();i++){
        item[i].total=(int) (item[i].yi*1.0/1.5+item[i].jia*1.0+item[i].ding*1.5);
    }
    qsort(item+1,mapSchool.size(),sizeof(item[0]),cmp);//排序
    printf("%d\n",mapSchool.size());
    int totalgrade=0;
    int rank=2;
    for(int i=1;i<=mapSchool.size();i++){
        if(item[i].total!=totalgrade){
            totalgrade=item[i].total;
            rank=i+1;
            printf("%d %s %d %d\n",i,item[i].name.c_str(),item[i].total,item[i].num);  
        }
        else{
            printf("%d %s %d %d\n",rank-1,item[i].name.c_str(),item[i].total,item[i].num);  
        }
    }
    return 0;
}

你可能感兴趣的:(PAT乙级)