题目描述
链接
给出每个学生的id、分数、学校,学校名称不区分大小写,输出学校排名、学校名称、总加权成绩、学校参赛人数。学校名称输出时候以小写方式输出
分析
- 用s1,s2,score,sum,cnt这些来临时统计,然后用map对每个学校进行存储
- 大小写转换:直接对单个字符使用tolower(),对于是小写的,它默认不转换
- 注意!!!!是对最后的sum取整!!!不是中间!!否则会出错!三分的点
- 排名的处理!!!!
int rank = 0, pres = -1;
for (int i = 0; i < ans.size(); i++) {
if (pres != ans[i].tws) rank = i + 1;
pres = ans[i].tws;
}
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
string s;
int cnt;
int sum;
};
unordered_map<string, pair<int,double> > mp;
bool cmp(node &x, node &y){
if(x.sum == y.sum && x.cnt == y.cnt) return x.s < y.s;
else if(x.sum == y.sum) return x.cnt < y.cnt;
else return x.sum > y.sum;
}
int n;
int main(){
scanf("%d", &n);
for(int i=0;i<n;i++){
string s1,s2;
int score;
double sum;
cin>>s1>>score>>s2;
for(int j=0;j<s2.length();j++){
if(isupper(s2[j])) s2[j] = s2[j]-'A'+'a';
}
if(s1[0] == 'T') sum = 3 * score / 2.0;
else if(s1[0] == 'A') sum = score;
else if(s1[0] == 'B') sum = score * 2 / 3.0;
if(mp.find(s2) == mp.end()) mp[s2] = make_pair(0,0.0);
mp[s2].first++; mp[s2].second += sum;
}
vector<node> ans;
for(auto it=mp.begin(); it != mp.end(); it++){
ans.push_back(node{it->first, (it->second).first, (int)(it->second).second}); //注意!!!
}
sort(ans.begin(), ans.end(), cmp);
printf("%d\n", ans.size());
int rank = 1;
int cnt = 0;
for(int i=0;i<ans.size();i++){
if(i!= 0){
if(ans[i].sum != ans[i-1].sum){
rank += cnt;
cnt = 0;
}
}
printf("%d %s %d %d\n", rank, ans[i].s.c_str(), ans[i].sum, ans[i].cnt);
cnt++;
}
}