题意:
给定一些参赛选手的 竞赛级别,成绩,学校信息,
然后以学校为的单位进行排序,每个学校包含:名称,总成绩(加权,如题),学生人数
思路:
用map将学校映射成id,然后记录分数,人数
没看到学校去分数的时候是取小数的整数部分,搞了好久。。。
#include<bits/stdc++.h>
#include<cstring>
#define FI first
#define SE second
using namespace std;
typedef long long ll;
typedef pair<int, int> P;
const int maxn = 1e5 + 7;
int n, cnt = 1;
string id, sch;
int sc;
map<string, int> mp;
double sum[maxn];
int num[maxn];
struct node{
string na;
int sum;
int num;
};
bool cmp(node a, node b) {
if(a.sum == b.sum) {
if(a.num == b.num) {
return a.na < b.na;
}
else return a.num < b.num;
}
else return a.sum > b.sum;
}
string ss(string s) {
for(int i = 0; i < s.size(); ++i) {
if(s[i] >= 'A' && s[i] <= 'Z') {
s[i] = 'a' + s[i] - 'A';
}
}
return s;
}
int main() {
cin >> n;
for(int i = 1; i <= n; ++i) {
cin >> id >> sc >> sch;
sch = ss(sch);
if(!mp[sch]) mp[sch] = cnt++;
int t = mp[sch];
num[t]++;
if(id[0] == 'B') {
sum[t] += sc/1.5;
}
else if(id[0] == 'A') {
sum[t] += sc;
}
else if(id[0] == 'T') {
sum[t] += sc*1.5;
}
}
cout << (int)mp.size() << endl;
vector<node> ans;
for(auto i : mp) {
ans.push_back(node{i.FI, floor(sum[i.SE]), num[i.SE]});
}
sort(ans.begin(), ans.end(), cmp);
printf("1 %s %d %d\n", ans[0].na.c_str(), ans[0].sum, ans[0].num);
int t1 = 1, t2 = 2;
for(int i = 1; i < ans.size(); ++i) {
if(ans[i].sum == ans[i-1].sum) {
printf("%d %s %d %d\n", t1, ans[i].na.c_str(), ans[i].sum, ans[i].num);
}
else {
t1 = t2;
printf("%d %s %d %d\n", t2, ans[i].na.c_str(), ans[i].sum, ans[i].num);
}
t2++;
}
return 0;
}