# PAT 1085 PAT单位排行 (Microsoft_zzt)

2018/08/08 21:49

https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400

### 输入格式：

准考证号 得分 学校


### 输出格式：

排名 学校 加权总分 考生人数


### 输入样例：

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 <cstdio>
#include <string>
#include <map>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;

map<string, int> s_n;
map<int, string> n_s;

const int maxn = 1e5 + 10;
struct X {
string name;
int a[3];
int g;
int num;
}s[maxn];

bool cmp(const X& a, const X& b) {
if (a.g != b.g) return a.g > b.g;
if (a.num != b.num) return a.num < b.num;
return a.name < b.name;
}

int main() {
int n;
scanf("%d", &n);
int sz = 0;
for (int i = 1; i <= n; i++) {
string id;
int x;
string name;
cin >> id >> x >> name;
for (int j = 0; j < name.length(); j++) {
if (name[j] >= 'A' && name[j] <= 'Z') {
name[j] = name[j] - 'A' + 'a';
}
}

int h = s_n[name];
if (h == 0) {
sz++;
s_n[name] = sz;
n_s[sz] = name;
h = sz;
}
s[h].name = name;
s[h].num++;

int o;
if (id[0] == 'A') o = 0;
else if (id[0] == 'B') o = 1;
else if (id[0] == 'T') o = 2;
s[h].a[o] += x;
}

for (int i = 1; i <= sz; i ++) {
s[i].g = (int)(1.0 * s[i].a[0] + 1.0 * s[i].a[1] / 1.5 + 1.0 * s[i].a[2] * 1.5);
}

sort(s + 1, s + sz + 1, cmp);

printf("%d\n", sz);
int rank = 1;
for (int i = 1; i <= sz; i++) {
if (s[i].g != s[i - 1].g) rank = i;
cout << rank << " " << s[i].name << " " << s[i].g << " " << s[i].num << endl;
}
return 0;
}

0
0 收藏

0 评论
0 收藏
0