Skip to content

Latest commit

 

History

History
85 lines (79 loc) · 2.1 KB

A1025.md

File metadata and controls

85 lines (79 loc) · 2.1 KB

A1025 PAT Ranking

1.题意理解

PAT考完之后要排名。先把各个考场排名,再合并起来。

2.思路分析

先对每个考场排名,存入信息结构体中。

再将所有记录放入一个容器中进行总排,排名rank的计数逻辑是相同的。

3.参考代码

#include <bits/stdc++.h>
using namespace std;
const int N = 128, K = 310;
typedef long long ll;
struct info
{
    char reg[15];
    int grade;
    int fin_rank;
    int loc_num;
    int loc_rank;
};
vector<info> testee[N], ans;

bool cmp_grade(const info &a, const info &b)
{
    return a.grade > b.grade;
}
bool cmp(const info &a, const info &b)
{
    if (a.grade != b.grade)
        return a.grade > b.grade;
    else
        return strcmp(a.reg, b.reg) <= 0;
}

int main()
{
    int n;
    scanf("%d", &n);
    int k;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &k);
        testee[i].resize(k);
        for (int j = 0; j < k; j++)
        {
            testee[i][j].loc_num = i;
            scanf("%s%d", testee[i][j].reg, &testee[i][j].grade);
        }
        sort(testee[i].begin(), testee[i].end(), cmp_grade);
        int rank = 0, temp_rank = 0, temp_grade = 9999;
        for (int j = 0; j < k; j++)
        {
            temp_rank++;
            if (testee[i][j].grade < temp_grade)
            {
                rank = temp_rank;
                temp_grade = testee[i][j].grade;
            }
            testee[i][j].loc_rank = rank;
        }
    }
    for (int i = 1; i <= n; i++)
        for (int j = 0; j < testee[i].size(); j++)
            ans.push_back(testee[i][j]);
    printf("%d\n", ans.size());
    sort(ans.begin(), ans.end(), cmp);
    int rank = 0, temp_rank = 0, temp_grade = 9999;
    for (int i = 0; i < ans.size(); i++)
    {
        temp_rank++;
        if (ans[i].grade < temp_grade)
        {
            rank = temp_rank;
            temp_grade = ans[i].grade;
        }
        printf("%s %d %d %d\n", ans[i].reg, rank, ans[i].loc_num, ans[i].loc_rank);
    }
    system("pause");
    return 0;
}