注意点:
1.输出学校全小写,输入用tolower改小写
2.加权总分分别求出乙 甲 顶级总分后再算,一个人一个人算损失精度
3.结构体数组索引从一开始
#include <bits/stdc++.h>
using namespace std;
const int N = 1E5 + 10;
int idx = 1;
int sum;
struct S
{
int rank;
double total_sa = 0, total_sb = 0, total_st = 0;
double total = 0;
int num = 0;
string school;
bool operator< (S s)
{
if(s.total != total)
return total > s.total;
if(s.num != num)
return num < s.num;
return school < s.school;
}
}s[N];
int main()
{
int n;
cin >> n;
unordered_map<string, int> map;
while(n --)
{
string id, school;
int score;
cin >> id >> score >> school;
for(int i = 0; i < school.size(); i ++)
school[i] = tolower(school[i]);
char c = id[0];
if(!map[school])
{
map[school] = idx ++;
sum ++;
}
int t = map[school];
s[t].school = school, s[t].num ++;
if(c == 'A')
s[t].total_sa += score;
else if(c == 'B')
s[t].total_sb += score;
else
s[t].total_st += score;
}
for(int i = 1; i < idx; i ++)
s[i].total = int(s[i].total_sa + s[i].total_sb / 1.5 + s[i].total_st * 1.5);
sort(s + 1, s + idx);
s[1].rank = 1;
int num = 2;
for(int i = 2; i < idx; i ++)
{
if(s[i].total == s[i - 1].total)
s[i].rank = s[i - 1].rank;
else
s[i].rank = num;
num ++;
}
cout << sum << endl;
for(int i = 1; i < idx; i ++)
cout << s[i].rank << ' ' << s[i].school << ' ' << s[i].total << ' ' << s[i].num << endl;
return 0;
}