文章目录
题目分析
来源:acwing
分析:和下面这题是一道题:
PAT甲级1137 Final Grading:[C++题解]结构体、排序、哈希表、结构体构造函数、结构体内写函数
排名得记录一下,做过几道类似的题目:学校首先按加权总分排行。如有并列,则应对应相同的排名,并按考生人数升序输出。这种处理方式是设一个变量rank,如果分数不一样的话,排名rank就等于前面的人数+1;如果分数一样的话,rank不变。
样例:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2
代码:
int rank =1;
for(int i = 0; i<schools.size(); i++){
auto a = schools[i];
if(i== 0 || a.score != schools[i-1].score) rank = i+1;
printf("%d %s %d %d\n",rank,a.id.c_str(),a.score,a.cnt);
}
ac代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int n;
struct School{
string id;
int b,a,t;
int cnt;
int score;
//默认构造函数
School(): b(0),a(0),t(0),cnt(0),score(0) {}
//求总分数,取整(int)不是四舍五入
void calc(){
score = (int)(b/1.5 + a + t*1.5);
}
//排序:重载小于号
bool operator<(const School& s)const{
if(score != s.score) return score > s.score;
else if(cnt != s.cnt) return cnt < s.cnt;
return id < s.id;
}
};
//变成小写
string change(string a){
string res;
for(auto s :a)
s=tolower(s),res +=s;
return res;
}
int main(){
cin >>n ;
//hash表
unordered_map<string,School> hash1;
for(int i = 0; i<n ; i++){
string id,sch;
int score;
cin >> id >> score >> sch;
sch=change(sch);
if(id[0]=='B') hash1[sch].b += score;
if(id[0]=='A') hash1[sch].a += score;
if(id[0]=='T') hash1[sch].t += score;
hash1[sch].cnt ++;
hash1[sch].id = sch;
}
vector<School> schools;
for(auto sch:hash1) {
auto s = sch.second;
s.calc(); //求总分
schools.push_back(s);//放进vector
}
sort(schools.begin(),schools.end());
cout<< schools.size()<<endl;
//排名
int rank =1;
for(int i = 0; i<schools.size(); i++){
auto a = schools[i];
if(i== 0 || a.score != schools[i-1].score) rank = i+1;
printf("%d %s %d %d\n",rank,a.id.c_str(),a.score,a.cnt);
}
}
题目来源
PAT甲级1141 PAT Ranking of Institutions
https://www.acwing.com/problem/content/1636/