题目
https://pintia.cn/problem-sets/994805342720868352/problems/994805344222429184
题意
题目会给出N个学生的ID、分数、学校,要求在统计每个学校的总人数和总分数后,按要求输出
题目解析
通过map存储每一个学校的相关信息,之后遍历map将元素存入ans的vector向量中,再按照题目要求对ans排序,最后按照排名输出即可
注意
成员变量sum要设为double类型,并在存入ans时转化为int,而不能一开始就设为int类型(否则无法通过最后一个测试点)
AC代码
#include<bits/stdc++.h>
using namespace std;
struct node{
double sum;
int cnt;
};
struct node1{
string s;
node t;
};
map<string,node> maps;
vector<node1> ans;
bool cmp(node1 x,node1 y){
if(x.t.sum==y.t.sum)
{
if(x.t.cnt==y.t.cnt) return x.s<y.s;
else return x.t.cnt<y.t.cnt;
}
else return x.t.sum>y.t.sum;
}
int main()
{
int n,score;
string id,school;
cin>>n;
while(n--)
{
cin>>id>>score>>school;
for(int i=0;school[i];i++)
if(school[i]>='A'&&school[i]<='Z') school[i]+=32;
if(id[0]=='B') maps[school].sum+=score/1.5;
else if(id[0]=='A') maps[school].sum+=score;
else if(id[0]=='T') maps[school].sum+=score*1.5;
maps[school].cnt+=1;
}
for(auto it:maps)
{
it.second.sum=(int)it.second.sum;//转化
ans.push_back({it.first,it.second});
}
sort(ans.begin(),ans.end(),cmp);
cout<<ans.size()<<endl;
int rank=1;
for(int i=0;i<ans.size();i++)
{
if(i!=0&&ans[i].t.sum!=ans[i-1].t.sum) rank=i+1;
printf("%d %s %.0lf %d\n",rank,ans[i].s.c_str(),ans[i].t.sum,ans[i].t.cnt);
}
}