题目
思路
- 用一个结构体储存输入的学生信息,一个结构体储存学校的信息;
- 用一个map储存学校的总成绩,一个map储存学校的学生人数;
- 注意最后的加权成绩,需要汇总后再换为整型;
- 最后的排序输出通过结构体用sort函数进行排序;
做完发现自己的思路基本和柳神一致hhh。不过最后排名的输出测试点后两个没通过,就参考了柳神的代码。
AC代码
#include<bits/stdc++.h>
using namespace std;
struct stu{ //记录学生信息
string id;
double score;
string school;
};
struct sc{ //记录学校信息
string name;
int snum; //学生人数
int nscore; //学校加权成绩
sc(string a,int b):name(a),nscore(b){};
};
bool cmp(sc a,sc b){
if(a.nscore!=b.nscore) return a.nscore>b.nscore;
else if(a.snum!=b.snum) return a.snum<b.snum;
else return a.name<b.name;
}
int main(){
int n; cin>>n;
stu s[n];
unordered_map<string , double> mp;//统计学校总分
unordered_map<string, int> people;//统计学校人数
string temp;
for(int i=0;i<n;i++){
cin>>s[i].id>>s[i].score>>temp;
for(int j=0;j<temp.length();j++){ //学校转换为小写
if(temp[j]>='A'&&temp[j]<='Z'){
temp[j]+=32;
}
}
s[i].school=temp;
people[temp]++;
switch(s[i].id[0]-'A') {
case 0:{
mp[temp] += s[i].score;
break;
}
case 1:{
mp[temp] += s[i].score/1.5;
break;
}
case 19:{
mp[temp] += s[i].score*1.5;
break;
}
}
}
vector <sc> v;
for(unordered_map<string,double>::iterator it=mp.begin();it!=mp.end();it++){
v.push_back(sc(it->first,(int)it->second));
}
for(int i=0;i<v.size();i++){
v[i].snum=people[v[i].name];
}
sort(v.begin(),v.end(),cmp);
cout<<v.size()<<endl;
int rank=0,pres=-1;
for(int i=0;i<v.size();i++){
if(pres!=v[i].nscore) rank=i+1;
pres=v[i].nscore;
cout<<rank<<' ';
cout<<v[i].name<<' '<<v[i].nscore<<' '<<v[i].snum<<endl;
}
return 0;
}