PTA 乙级1085 PAT单位排行 (25 分)

主要是为了记录错误点写
题目:PATB1085

每次 PAT 考试结束后,考试中心都会发布一个考生单位排行榜。本题就请你实现这个功能。
输入格式:

输入第一行给出一个正整数 N(≤10​5​​),即考生人数。随后 N 行,每行按下列格式给出一个考生的信息:

准考证号 得分 学校

其中准考证号是由 6 个字符组成的字符串,其首字母表示考试的级别:B代表乙级,A代表甲级,T代表顶级;得分是 [0, 100] 区间内的整数;学校是由不超过 6 个英文字母组成的单位码(大小写无关)。注意:题目保证每个考生的准考证号是不同的。
输出格式:

首先在一行中输出单位个数。随后按以下格式非降序输出单位的排行榜:

排名 学校 加权总分 考生人数

其中排名是该单位的排名(从 1 开始);学校是全部按小写字母输出的单位码;加权总分定义为乙级总分/1.5 + 甲级总分 + 顶级总分*1.5的整数部分;考生人数是该属于单位的考生的总人数。

学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。如果仍然并列,则按单位码的字典序输出。

卡在测试点5,查了其他帖子,都是说要注意对成绩的整形化,要在所有学生都记录进去后再进行,我看了五遍自己的代码,懵逼了,怎么回事,我就是先记录再取整的。

没 想 到 是 在 比 较 函 数 这 里 栽 了 \color{red}{没想到是在比较函数这里栽了} ,double与double 比较就会出现 1.3 <1.5这样的情况。实际上只要取整数部分比较就好!!

#include
#include
#include
#include
#include
#include
using namespace std;
struct Node{
	string school;
	int cnt;
	double total;
}node[100002];
bool cmp(Node a,Node b){
	int ttla=(int)a.total,ttlb=(int)b.total;
	if(ttla!=ttlb){
		return a.total>b.total;
	}else{
		if(a.cnt!=b.cnt){
			return a.cnt<b.cnt;
		}else{
			return a.school<b.school;
		}
	}
}
int main(){
	int N;
	scanf("%d",&N);
	map<string,int> mp;
	string sc,num;
	double score;
	int count=1;
	for(int i=1;i<=N;i++){
		cin>>num>>score>>sc;
		for(int j=0;j<sc.length();j++){
			sc[j]=tolower(sc[j]);
		}
		 if(num[0]=='B'){
			score=score/1.5; 
		}else if(num[0]=='T'){
			score*=1.5;
		} 
		if(mp[sc]==0){	
		node[count].school=sc;
		node[count].cnt++;
		node[count].total+=score;
		mp[sc]=count++;
		}else{
			int t=mp[sc];
			node[t].cnt++;
			node[t].total+=score;
		}
	}
	sort(node+1,node+count,cmp);
	cout<<count-1<<endl;
	int cnt=1,pre=0,ttl=0;
	for(int i=1;i<count;i++){
		ttl=int(node[i].total);
		if(i==1){
			pre=ttl;
		}else if(ttl!=pre){
				pre=ttl;
				cnt=i; 
			}
		printf("%d %s %d %d\n",cnt,node[i].school.c_str(),ttl,node[i].cnt);
	}
	return 0;
	}

当然更有借鉴价值的是柳神代码

你可能感兴趣的:(PAT做题)