PAT甲级真题1025 PAT 排名(STL运用)

编程能力测试(PAT)由浙大组织,多地区同时进行,测试后需合并成绩生成总排名。需编写程序,按给定输入格式处理各地区成绩,按输出格式输出总考生人数及最终成绩排名列表,同时给出了数据范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编程能力测试(PAT)由浙江大学计算机科学与技术学院组织。

每次测试都会在多个地区同时进行,测试完成后,将会对成绩进行统计与合并,生成总排名。

你的任务就是编写一个程序,将各地区人员的成绩合并汇总,生成最终排名。

输入格式
第一行包含整数 NN,表示测试将会在 NN 个地区同时进行。

接下来是 NN 个地区的成绩列表。

每个地区的成绩列表,第一行包含整数 KK,表示该地区的测试人数。

接下来 KK 行,每行包含一个学生的考号(1313 位数字)以及该学生的成绩。

输出格式
第一行输出总考生人数。

然后用以下格式输出最终成绩排名列表:

registration_number final_rank location_number local_rank
也就是输出考号,最终排名,地区编号,地区排名。

地区编号按输入顺序依次为 1∼N1∼N。

按照最终排名从前到后的顺序输出每个人的信息。

具有相同分数的人的排名也要相同,相同分数的人,考号较小的先输出。

数据范围
1≤N≤1001≤N≤100,
1≤K≤3001≤K≤300,
分数在 [0,100][0,100] 范围内。

输入样例:
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
输出样例:
9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4
#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

const int N = 110;

struct Student
{
    string id;
    int grade;
    int location_number, local_rank, final_rank;

    bool operator< (const Student& t) const
    {
        if (grade != t.grade) return grade > t.grade;
        return id < t.id;
    }
};

vector<Student> grades[N];
vector<Student> all;

int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i ++ )
    {
        int k;
        cin >> k;
        for (int j = 0; j < k; j ++ )
        {
            string id;
            int grade;
            cin >> id >> grade;
            grades[i].push_back({id, grade, i});
        }

        vector<Student> g = grades[i];
        sort(g.begin(), g.end());
        for (int i = 0; i < g.size(); i ++ )
        {
            if (!i || g[i].grade != g[i - 1].grade)
                g[i].local_rank = i + 1;
            else
                g[i].local_rank = g[i - 1].local_rank;
            all.push_back(g[i]);
        }
    }

    sort(all.begin(), all.end());
    for (int i = 0; i < all.size(); i ++ )
        if (!i || all[i].grade != all[i - 1].grade)
            all[i].final_rank = i + 1;
        else
            all[i].final_rank = all[i - 1].final_rank;

    cout << all.size() << endl;
    for (vector<Student>::iterator it=all.begin();it!= all.end();it++)
        cout << (*it).id << ' ' << (*it).final_rank << ' ' << (*it).location_number << ' ' << (*it).local_rank << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小王子y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值