PAT 1085 PAT单位排行 25分

84 阅读1分钟

题目:1085 PAT单位排行 - PAT (Basic Level) Practice (中文) (pintia.cn)

解析:85_哔哩哔哩_bilibili

用三个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;
}