【PAT乙】1085 PAT單位排行 (25分) map排序

problem

每次 PAT 考試結束後,考試中心都會發佈一個考生單位排行榜。本題就請你實現這個功能。

輸入格式:
輸入第一行給出一個正整數 N(≤10
​5
​​ ),即考生人數。隨後 N 行,每行按下列格式給出一個考生的信息:

准考證號 得分 學校

其中准考證號是由 6 個字符組成的字符串,其首字母表示考試的級別:B代表乙級,A代表甲級,T代表頂級;得分是 [0, 100] 區間內的整數;學校是由不超過 6 個英文字母組成的單位碼(大小寫無關)。注意:題目保證每個考生的准考證號是不同的。

輸出格式:
首先在一行中輸出單位個數。隨後按以下格式非降序輸出單位的排行榜:

排名 學校 加權總分 考生人數

其中排名是該單位的排名(從 1 開始);學校是全部按小寫字母輸出的單位碼;加權總分定義爲乙級總分/1.5 + 甲級總分 + 頂級總分*1.5的整數部分;考生人數是該屬於單位的考生的總人數。

學校首先按加權總分排行。如有並列,則應對應相同的排名,並按考生人數升序輸出。如果仍然並列,則按單位碼的字典序輸出。

輸入樣例:
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu

輸出樣例:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2

solution

  • 思路:就是用map維護學校序列,輸入數據時更新對應值
  • 學校名大小寫無關所以全部轉爲小寫
  • 成績排序時轉爲vector手寫cmp
  • 題目說的是把總分除以1.5而不是每次除,最後一個點數據大了精度過不去所以分開統計
#include<iostream>
#include<algorithm>
#include<string>
#include<map>
#include<vector>
using namespace std;

struct school{
	string name;
	//double score;
	int s1,s2,s3,score;
	int number;
	school(){s1=s2=s3=score=0,number=0;}
};
void xiaoxie(string &x){
	for(int i = 0; i < x.size(); i++)
		x[i] = tolower(x[i]);
}
bool cmp(pair<string,school> a, pair<string,school> b){
	if(a.second.score != b.second.score)return a.second.score>b.second.score;
	if(a.second.number != b.second.number)return a.second.number<b.second.number;
	return a.second.name<b.second.name;
}

int main(){
	int n;  cin>>n;
	map<string,school>mm;
	for(int i = 1; i <= n; i++){
		string id,sch; int num;
		cin>>id>>num>>sch;
		xiaoxie(sch);
		//處理輸入數據
		if(!mm.count(sch))mm[sch].name = sch;
		mm[sch].number++;
		if(id[0]=='A')mm[sch].s1 += num;
		if(id[0]=='B')mm[sch].s2 += num;
		if(id[0]=='T')mm[sch].s3 += num;
	}
	//mmp:題目說的是把總分除以1.5而不是每次除,最後一個點數據大了精度過不去
	for(map<string,school>::iterator it = mm.begin(); it != mm.end(); it++){
		it->second.score = it->second.s1+it->second.s2/1.5+it->second.s3*1.5;
	}
	//用vector排序map<key,value>中value的值,(map默認key排序
	vector<pair<string,school> >vec(mm.begin(),mm.end());
	sort(vec.begin(),vec.end(),cmp);
	int rank = 1;
	cout<<vec.size()<<'\n';
	for(int i = 0; i < vec.size(); i++){
		if(i!=0 && (int)vec[i].second.score!=(int)vec[i-1].second.score)rank=i+1;
		cout<<rank<<' '<<vec[i].second.name<<' '<<(int)vec[i].second.score<<' '<<vec[i].second.number<<'\n';
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章