题目大意:
给定N个学生的ID,成绩和所属学校,现要求按照每一个学校参与的学生信息获取学校的排名并输出。
算法思路:
我们使用Institution保存需要输出的学院的每一个信息,在输入的时候使用map institution容器来保存每一个学校的相关信息,然后再将信息搜集完毕所有学校添加进vector result容器中以方便排序从而获取排名,最后再输出即可。
获取排名的方法:
// 获取排名
for(int i=0;i<result.size();++i){
if(i==0 || result[i].tws!=result[i-1].tws){
result[i].rank = i+1;
}else {
result[i].rank = result[i-1].rank;
}
}
注意点:
- 1、输出的所有学校都是小写字母组成的,输入的时候得进行处理。
- 2、学校的加权平均分是直接截断浮点数得到的,不是四舍五入。
- 3、排序的时候,依据的是截断后的加权平均分进行的比较。
提交结果:
AC代码:
#include<vector>
#include<string>
#include<iostream>
#include<unordered_map>
#include<algorithm>
using namespace std;
struct Institution{
int rank;
string school;
double TWS;
int tws;
int Ns;
};
unordered_map<string,Institution> institution;
vector<Institution> result;
bool cmp(const Institution &a,const Institution &b){
return a.tws!=b.tws?a.tws>b.tws:a.Ns!=b.Ns?a.Ns<b.Ns:a.school<b.school;
}
string toLowerCase(const string &s){
string r;
for(int i=0;i<s.size();++i){
if(s[i]>='A'&&s[i]<='Z'){
r += (s[i]+32);
}else{
r += s[i];
}
}
return r;
}
int main(){
int N;
scanf("%d",&N);
string id,school;
int score;
for(int i=0;i<N;++i){
cin>>id>>score>>school;
// 将学校名字转化为小写字符串
string r = toLowerCase(school);
institution[r].school = r;
if(id[0]=='B'){
institution[r].TWS += score/1.5;
}else if(id[0]=='A'){
institution[r].TWS += score;
}else{
institution[r].TWS += score*1.5;
}
++institution[r].Ns;
}
unordered_map<string,Institution>::iterator it;
// 将所有学校添加进 result中方便排序
for(it=institution.begin();it!=institution.end();++it){
it->second.tws = (int)it->second.TWS;
result.push_back(it->second);
}
sort(result.begin(),result.end(),cmp);
// 获取排名
for(int i=0;i<result.size();++i){
if(i==0 || result[i].tws!=result[i-1].tws){
result[i].rank = i+1;
}else {
result[i].rank = result[i-1].rank;
}
}
// 输出
printf("%lu\n",result.size());
for(auto &item:result){
printf("%d %s %d %d\n",item.rank,item.school.c_str(),item.tws,item.Ns);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。