每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入格式:
输入第一行给出一个正整数N(<=105),即考生人数。随后N行,每行按下列格式给出一个考生的信息:
准考证号 得分 学校
其中“准考证号”是由6个字符组成的字符串,其首字母表示考试的级别:“B”代表乙级,“A”代表甲级,“T”代表顶级;“得分”是 [0,100] 区间内的整数;“学校”是由不超过6个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
输出格式:
首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:
排名 学校 加权总分 考生人数
其中“排名”是该单位的排名(从1开始);“学校”是全部按小写字母输出的单位码;“加权总分”定义为“乙级总分/1.5 + 甲级总分 + 顶级总分*1.5”的整数部分;“考生人数”是该属于单位的考生的总人数。
学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。
输入样例:10 A57908 85 Au B57908 54 LanX A37487 60 au T28374 67 CMU T32486 24 hypu A66734 92 cmu B76378 71 AU A47780 45 lanx A72809 100 pku A03274 45 hypu输出样例:
5 1 cmu 192 2 1 au 192 3 3 pku 100 1 4 hypu 81 2 4 lanx 81 2
从前面的题里接触到了map,这里首次尝试使用map解题,就是用map存标号那里,标号要从1开始存,从0开始存的话if(!map(str))那里会出错。
#include <iostream>
#include <map>
#include <string>
#include <algorithm>
using namespace std;
struct schools{
string name;
int A;
int B;
int T;
int all;
int num;
schools(int a=0,int b=0,int c=0,int d=0,int n=0){
A=a;
B=b;
T=c;
all=d;
num=n;
}
}s[100002];
bool cmp(schools a,schools b){
if(a.all>b.all){
return true;
}
else if(a.all==b.all&&a.num<b.num){
return true;
}
else if(a.all==b.all&&a.num==b.num&&a.name<b.name){
return true;
}
return false;
}
int main(){
int N;
scanf("%d",&N);
map<string,int>m;
char number[10];
int grade;
string school;
int k=1; //要从1开始,因为后面if判断那里会把0项漏掉
for(int i=0;i<N;i++){
scanf("%s%d",&number,&grade);
cin>>school;
int p=0;
while(school[p]!=0){
if(school[p]>='A'&&school[p]<='Z'){
school[p]=school[p]+32;
}
p++;
}
if(!m[school]){
m[school]=k;
k++;
}
s[m[school]].name=school;
if(number[0]=='A'){
s[m[school]].A+=grade;
}
else if(number[0]=='B'){
s[m[school]].B+=grade;
}
else if(number[0]=='T'){
s[m[school]].T+=grade;
}
s[m[school]].num++;
}
for(int i=1;i<k;i++){
s[i].all=(int)(s[i].B/1.5+s[i].A+s[i].T*1.5);
}
sort(s+1,s+k,cmp);
printf("%d\n",k-1);
int kk=1;
printf("%d ",kk);
for(int i=1;i<k;i++){
cout<<s[i].name;
printf(" %d %d\n",s[i].all,s[i].num);
if(i<k-1&&s[i+1].all==s[i].all){
printf("%d ",kk);
}
else if(i<k-1){
printf("%d ",i+1);
kk=i+1;
}
}
return 0;
}