题目分析
代码
// _1141_PAT_Ranking_of_Institutions.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <unordered_map>
using namespace std;
struct Student {
string id;
int score;
string school;
};
struct Institution {
string school;
double tws;
int ns;
};
int N;
bool cmp(Institution &a,Institution &b) {
if (a.tws != b.tws)return a.tws > b.tws;
else if (a.ns != b.ns) return a.ns < b.ns;
else return a.school < b.school;
}
int main()
{
cin >> N;
vector<Student> stus(N);
for (int i = 0; i < N; i++) {
string t;
cin >> stus[i].id >> stus[i].score >> t;
transform(t.cbegin(),t.cend(),t.begin(),::tolower);
stus[i].school = t;
}
unordered_map<string, Institution> institution_map;
for (auto stu : stus) {
if (institution_map.find(stu.school) == institution_map.end()) {
institution_map[stu.school] = { stu.school,0,0 };
}
institution_map[stu.school].ns++;
if (stu.id.substr(0, 1) == "B") {
institution_map[stu.school].tws+= (stu.score / 1.5);
}
else if (stu.id.substr(0, 1) == "A") {
institution_map[stu.school].tws += stu.score;
}
else if (stu.id.substr(0, 1) == "T") {
institution_map[stu.school].tws+= (1.5 * stu.score);
}
}
vector<Institution> v;
for (auto t : institution_map) {
t.second.tws = (int)t.second.tws;
v.push_back(t.second);
}
sort(v.begin(), v.end(), cmp);
printf("%d\n",int( v.size()));
int last_rank = 0,last_tws =0;
for (unsigned int i=0;i<v.size();i++) {
Institution t = v[i];
int rank = i + 1;
int score = int(t.tws);
if (last_tws == score) {
rank = last_rank;
}
printf("%d %s %d %d\n", rank, t.school.c_str(), score, t.ns);
last_rank = rank;
last_tws = score;
}
}