PAT甲级-1025 Ranking

题目

 

题目大意

给参加PAT的考生排名,输入给出考场数,再给出每个考场的人数、每个人的编号和分数。要求输出参加考试的总人数以及每个考生的编号、总排名、考场号、考场内的排名。

思路

定义结构体,考场内小数组排序,得到考场内的排名后加入大数组中。最后对大数组排序,得到每个考生的最终排名。注意相同成绩的人,输出顺序按编号从小到大输出

代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct student{
    string id;
    int score;
    int frank;
    int lnum;
    int lrank;
};

bool cmp(student x, student y){
    return x.score == y.score ? x.id < y.id : x.score > y.score;
}  // 相同分数时按学号从小到大排列!!!

int main(){
    int n;
    cin >> n;
    vector<student> total;  // 总的大数组
    for (int i = 1; i <= n; i++){
        int m;
        cin >> m;
        vector<student> v(m + 1);  // 每个考场的小数组
        for (int j = 1; j <= m; j++){
            cin >> v[j].id >> v[j].score;
            v[j].lnum = i;
        }
        sort(v.begin() + 1, v.end(), cmp);  // 从1开始排序
        v[1].lrank = 1;
        for (int j = 2; j <= m; j++){
            v[j].score == v[j - 1].score ? v[j].lrank = v[j - 1].lrank : v[j].lrank = j;
        }
        for (int j = 1; j <= m; j++){
            total.push_back(v[j]);
        }
    }
    sort(total.begin(), total.end(), cmp);
    total[0].frank = 1;
    for (int i = 1; i < (int)total.size(); i++){
        total[i].score == total[i - 1].score ? total[i].frank = total[i - 1].frank : total[i].frank = i + 1;
    }

    cout << (int)total.size() << endl;
    for (int i = 0; i < (int)total.size(); i++){
        cout << total[i].id << " " << total[i].frank << " " << total[i].lnum << " " << total[i].lrank << endl;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值