第十八天PAT-A1141 PAT Ranking of Institutions排序模拟

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值