A1141
Description:
给出一组学生的考号ID 分数Score以及考点学校School,求各学校的总分排名,及该学校有多少人参与考试;
注意:
- 读题容易疏忽,tws本身就是个整数,所以tws要在比较函数比较前就计算好加权和,但是加权和又不能每次都加权,而是所有同类同学校总分出来之后加权求和;
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<unordered_map>
#include<vector>
#include<queue>
using namespace std;
struct Sch{
string name;
int tws, cnt, st, sb; //cnt为考生计数器
};
int n;
unordered_map<string,Sch>mp; //学校名映射学校结构体
vector<Sch>ans;
bool cmp(Sch &a, Sch &b){
if(a.tws!=b.tws) return a.tws>b.tws;
else if(a.cnt!=b.cnt) return a.cnt<b.cnt;
else return a.name < b.name;
}
int main()
{
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE
scanf("%d", &n);
string schname, id;
int score;
while(n--){
cin>>id>>score>>schname;
for(int i = 0; i < schname.size(); i++)
schname[i] = tolower(schname[i]);
if(mp.count(schname)==0){ //新学校
Sch sch;
sch.name = schname;
sch.tws = 0, sch.st = 0, sch.sb = 0; //初始化
sch.cnt = 1;
if(id[0]=='T') sch.st += score; //不同等级的分数累加到不同的累加器
else if(id[0]=='B') sch.sb += score;
else sch.tws += score;
mp.insert(make_pair(schname, sch));
}else{ //学校存在
mp[schname].cnt++; //累加该学校考生数
if(id[0]=='T') mp[schname].st += score;
else if(id[0]=='B') mp[schname].sb += score;
else mp[schname].tws += score;
}
}
for(auto it=mp.begin(); it!=mp.end();it++){
Sch t = it->second;
t.tws += ((double)t.st*1.5 + (double)t.sb/1.5); //最后进行加权求和保留整数
ans.push_back(t);
}
sort(ans.begin(), ans.end(), cmp);
int len = ans.size();
printf("%d\n", len);
int preRank=-1; //保存上一排名
int preTws=-1; //保存上一排名对应tws分数
for(int i = 0; i < len; i++){
if(i==0){ //首个输出
preTws = ans[i].tws; //保存分数及排名信息
preRank = 1;
}
if(ans[i].tws==preTws){ //如果当前和上一名分数相同,则排名也相同
printf("%d ", preRank);
}else{
printf("%d ", i+1);
preRank = i+1;
preTws = ans[i].tws;
}
printf("%s %d %d\n", ans[i].name.c_str(), ans[i].tws, ans[i].cnt);
}
return 0;
}