题目:1085 PAT单位排行 - PAT (Basic Level) Practice (中文) (pintia.cn)
用三个map来统计甲乙顶的成绩,然后再用哈希统计学校的甲乙丁成绩之和。
#include<bits/stdc++.h>
using namespace std;
struct node
{
string school;
int score;
int cnt;
}stu;
map<string,int>a,b,t;
map<string,int>cnt;
vector<node>ans;
bool cmp(node a,node b)
{
if(a.score==b.score) //如果考生总分相同
{
if(a.cnt==b.cnt) //如果考生人数一样
{
return a.school<b.school; //按照字典序排
}
return a.cnt<b.cnt; //否则就按人数排
}
return a.score>b.score; //否则仍然按总分排
}
int main()
{
int N=0;cin>>N;
string id,school;
int cj;
for(int i=0;i<N;i++)
{
cin>>id>>cj>>school;
//学校全变为小写
for(int j=0;j<school.size();j++)
{
school[j]=tolower(school[j]);
}
//区分 甲 乙 ,顶级
if(id[0]=='A') a[school]+=cj;
if(id[0]=='B') b[school]+=cj;
if(id[0]=='T') t[school]+=cj;
cnt[school]++; //统计一下一个学校的参赛人数
}
//每个学校的编号,总成绩,参赛人数
for(auto i=cnt.begin();i!=cnt.end();i++)
{
stu.school=i->first;
stu.score=a[stu.school]+b[stu.school]/1.5+t[stu.school]*1.5;
stu.cnt=i->second;
ans.push_back(stu);
}
//排序
sort(ans.begin(),ans.end(),cmp);
//输出 单位个数
cout<<ans.size()<<endl;
int k=1;
for(int i=0;i<ans.size();i++)
{
// 排名 学校 加权总分 考生人数
cout<<k<<" "<<ans[i].school<<" "<<ans[i].score<<" "<<ans[i].cnt<<endl;
if(i+1<ans.size()&&ans[i].score!=ans[i+1].score) //如果下一个没有越界 并且 下一个学校的总成绩与当前学校不相同的话
k=i+1+1; //下标从0开始,所以i+1 //k值就++
}
return 0;
}