1085 PAT单位排行 (25 分)
题目链接
算法分析
1.读入考生信息,把学校字符串小写化,分析其学校是否第一次出现,若未出现,则增加新的学校,并更新该学校的考生数和考生总成绩。
2.计算每个学校的总成绩,并排序。
3.输出。
代码实现
两个亮点:1.如何分析学校第一次出现。2.如何输出题目要求的排名。
#include<bits/stdc++.h>
using namespace std;
struct school{
string id;
int cnt;
int mka, mkb, mkc, mk;
};
int cnt;
map< string, int >idx;
vector< school >sch;
bool cmp(school a, school b){
return a.mk == b.mk ? (a.cnt == b.cnt ? a.id < b.id : a.cnt < b.cnt) : a.mk > b.mk;
}
string strtolower(string s){
for(int i = 0; i < s.size(); ++ i)
if(isupper(s[i])) s[i] = s[i] - 'A' + 'a';
return s;
}
int main(){
int n, score;
string a, b;
scanf("%d", &n);
for(int i = 1; i <= n; ++ i){
cin>> a>> score>> b;
b = strtolower(b);
if(!idx[b]){
idx[b] = ++ cnt;
sch.push_back(school{b, 0, 0, 0, 0, 0});
}
sch[idx[b] - 1].cnt ++;
if(a[0] == 'B') sch[idx[b] - 1].mka += score;
else if(a[0] == 'A') sch[idx[b] - 1].mkb += score;
else sch[idx[b] - 1].mkc += score;
}
for(int i = 0; i < sch.size(); ++ i)
sch[i].mk = (int)(sch[i].mka / 1.5 + sch[i].mkb + sch[i].mkc * 1.5);
sort(sch.begin(), sch.end(), cmp);
int rank = 1;
printf("%d\n", sch.size());
for(int i = 0; i < sch.size(); ++ i){
printf("%d %s %d %d\n", rank, sch[i].id.c_str(), sch[i].mk, sch[i].cnt);
if(sch[i].mk != sch[i + 1].mk) rank = i + 2;
}
return 0;
}