不要使用cout和cin,否则会导致最后测试点超时;
另外注意,每个学校的总分是指每个学校各等级考试“总分”乘权重后的和的“整数部分”。因此,不要四舍五入,在录入成绩时,先对各等级考试分别计算总分不要乘权重,最后再根据权重计算total weighted score。
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <string>
#include <iostream>
using namespace std;
struct institution
{
string name;
int numtestee;
int tscore;
int scoreA;
int scoreB;
int scoreT;
int rank;
}A[100010];
bool cmp1(institution a,institution b)
{
if(a.tscore!=b.tscore)return a.tscore>b.tscore;
else if(a.numtestee!=b.numtestee)return a.numtestee<b.numtestee;
else return a.name<b.name;
}
int N;
void tolow(char a[])
{
for(int i=0;i<strlen(a);i++)
{
if(a[i]>='A'&&a[i]<='Z')
{
a[i]=a[i]-'A'+'a';
}
}
}
map<string,int> mp;
int main()
{
scanf("%d",&N);
int count=0;
char school[10];
char name[10];
for(int i=0;i<N;i++)
{
int score;
scanf("%s %d %s",&name,&score,&school);
tolow(school);
if(mp.find(school)==mp.end())
{
mp[school]=count++;
}
A[mp[school]].name=school;
A[mp[school]].numtestee++;
if(name[0]=='A')A[mp[school]].scoreA+=score;
if(name[0]=='B')A[mp[school]].scoreB+=score;
if(name[0]=='T')A[mp[school]].scoreT+=score;
}
for(int i=0;i<count;i++)
{
A[i].tscore=A[i].scoreA+A[i].scoreB/1.5+A[i].scoreT*1.5;
}
sort(A,A+count,cmp1);
A[0].rank=1;
int pre=0;
for(int i=1;i<count;i++)
{
if(A[i].tscore==A[pre].tscore)
{
A[i].rank=A[pre].rank;
}
else
{
A[i].rank=i+1;
pre=i;
}
}
printf("%d\n",count);
if(N!=0)
{
for(int i=0;i<count;i++)
{
printf("%d %s %d %d\n",A[i].rank,A[i].name.c_str(),A[i].tscore,A[i].numtestee);
}
}
system("pause");
return 0;
}