每次 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
代码:
#include<stdio.h>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std;
struct node
{
string firm;
double sum;
int sum1;
int num;
int Rank;
}person[100001];
map<string,struct node> Map;
bool cmp(struct node a,struct node b)
{
if(a.sum1!=b.sum1)
{
return a.sum1>b.sum1;
}
else if(a.num!=b.num)
{
return a.num<b.num;
}
else
{
return a.firm<b.firm;
}
}
int main()
{
int i,j,n,k,t,l,Rank;
double m;
scanf("%d",&n);
for(i=0;i<n;i++)
{
string g,f;
cin>>g>>m>>f;
for(j=0;j<f.size();j++)
{
if(f[j]>='A'&&f[j]<='Z')
{
f[j]=f[j]+32;
}
}
Map[f].firm=f;
if(g[0]=='A')
{
Map[f].sum+=m;
}
else if(g[0]=='B')
{
Map[f].sum+=(m/1.5);
}
else if(g[0]=='T')
{
Map[f].sum+=(m*1.5);
}
Map[f].num++;
}
map<string,struct node>::iterator it;
l=0;
for(it=Map.begin();it!=Map.end();it++)
{
person[l++]=it->second;
person[l-1].sum1=(int)person[l-1].sum;
}
sort(person,person+l,cmp);
person[0].Rank=1;
for(i=1;i<l;i++)
{
if(person[i].sum1==person[i-1].sum1)
{
person[i].Rank=person[i-1].Rank;
}
else
{
person[i].Rank=i+1;
}
}
printf("%d\n",l);
for(i=0;i<l;i++)
{
printf("%d %s %d %d\n",person[i].Rank,(person[i].firm).c_str(),person[i].sum1,person[i].num);
}
return 0;
}