PAT甲级1141PAT Ranking of Institutions
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/994805344222429184
题解
题目要求
n个考生,每个考生信息为:
-
ID
6个字符的字符串,第一位是考试等级(B、A、T)
-
score
分数,[0,100]的整数
-
school
不超6位的学校码,由英文字母组成,不区分大小写,但输入中有大小写
请输出:
-
第一行输出学校的数量
-
然后按rank的非降序输出Rank School TWS Ns
-
rank是排名,从1开始,根据TWS非升序排序。
如果TWS相等,则两校的rank也相等,且应按NS增序输出;如果Ns也相等,则按学校码的字母表顺序输出
-
school是学校码,用小写输出
-
TWS是加权分,等于该校B级考生总分/1.5+该校A级考生总分+该校T级考生总分*1.5,只取计算结果的整数部分
-
Ns是该校的考生数
-
思路
-
注意将学校码转换为小写
-
输出顺序有两方面:
- 如果TWS相等,则两校的rank也相等,这一点要在最后控制
- 其它输出顺序通过sort函数使用的cmp函数控制
-
我这里是使用了一个map,最后存入vector排序;也可以使用两个map(键都为学校码),一个存每个TWS,一个存Ns,最后都存入vector
我计算TWS的方法比较麻烦,因为刚开始理解错了TWS的公式
-
用map而不是unorder_map的话,最后一个测试点会超时
代码
// Problem: PAT Advanced 1141
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/994805344222429184
// Tags: map unordered_map sort
#include <iostream>
#include <string>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
struct School{
string code; // 小写的学校码
double testeeScoreSums[3] = {0, 0, 0};
int TWS;
int Ns = 0;
void calcTWS(){
this->TWS = testeeScoreSums[0] / 1.5 + testeeScoreSums[1] + testeeScoreSums[2] * 1.5;
}
};
// 按照要求比较两个学校
// 根据TWS非升序排序。如果TWS相等,则按Ns增序输出;如果Ns也相等,则按学校码的字母表顺序输出
bool schoolCmp(School &s1, School &s2){
if (s1.TWS == s2.TWS)
if (s1.Ns == s2.Ns)
return s1.code < s2.code;
else
return s1.Ns < s2.Ns;
else
return s1.TWS > s2.TWS;
}
int main()
{
int n, score; // the number of testees, the score of a testee
string id, schoolCode, testLevels="BAT"; // the id of a testee, the school of a testee, three test levels
unordered_map<string, School> schoolsMap; // 键为学校码,值为学校
// 获取输入
cin >> n;
for (int i = 0; i < n; i++){
cin >> id >> score >> schoolCode;
transform(schoolCode.begin(), schoolCode.end(), schoolCode.begin(), ::tolower); // 将学校码转为小写
schoolsMap[schoolCode].code = schoolCode;
for (int j = 0; j < 3; j++)
if(id[0] == testLevels[j]){
schoolsMap[schoolCode].testeeScoreSums[j] += score; // 分别统计该校三个等级考生的总分
schoolsMap[schoolCode].Ns += 1; // 统计该校考生数
break;
}
}
// 将学校存入vector并排序
vector<School> schools;
for (unordered_map<string, School>::iterator it = schoolsMap.begin(); it != schoolsMap.end(); it++){
it->second.calcTWS();
schools.push_back(it->second);
}
sort(schools.begin(), schools.end(), schoolCmp);
// 输出结果,如果TWS相等,则两校的rank也相等,其它输出顺序要求已通过schoolCmp控制
int schoolNum = schools.size(), rank = 1;
printf("%d\n%d %s %d %d\n", schoolNum, rank, schools[0].code.c_str(), schools[0].TWS, schools[0].Ns);
for (int i = 1; i < schoolNum; i++){
if(schools[i].TWS < schools[i-1].TWS)
rank = i+1;
printf("%d %s %d %d\n", rank, schools[i].code.c_str(), schools[i].TWS, schools[i].Ns);
}
return 0;
}
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!