1085 PAT单位排行 (25 分)

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;
}
上一篇:PAT——1074 Reversing Linked List 甲级(最后一个测试点着重说明)


下一篇:PAT乙级-1013 数素数