题目


解法1

点击查看代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

struct Student {
    string id;
    int regionId;
    int score;
    int final_rank;
    int local_rank;
};

bool cmpLocal(const Student &s1, const Student &s2) {
    if (s1.regionId == s2.regionId) {
        return s1.score > s2.score;
    }
    return s1.regionId < s2.regionId;
}

bool cmpFinal(const Student &s1, const Student &s2) {
    if (s1.score == s2.score) {
        return s1.id < s2.id;
    }
    return s1.score > s2.score;
}

int main() {
    int n;
    cin >> n;
    vector<Student> students;

    for (int i = 0; i < n; i++) {
        int k;
        cin >> k;
        for (int j = 0; j < k; j++) {
            Student s;
            cin >> s.id >> s.score;
            s.regionId = i + 1;
            students.push_back(s);
        }
    }

    // Calculate local ranks
    sort(students.begin(), students.end(), cmpLocal);
    for (int i = 0; i < students.size(); ) {
        int j = i;
        while (j < students.size() && students[j].regionId == students[i].regionId) {
            if (j > i && students[j].score == students[j - 1].score) {
                students[j].local_rank = students[j - 1].local_rank;
            } else {
                students[j].local_rank = j - i + 1;
            }
            j++;
        }
        i = j;
    }

    // Calculate final ranks
    sort(students.begin(), students.end(), cmpFinal);
    for (int i = 0; i < students.size(); i++) {
        if (i > 0 && students[i].score == students[i - 1].score) {
            students[i].final_rank = students[i - 1].final_rank;
        } else {
            students[i].final_rank = i + 1;
        }
    }

    // Output
    cout << students.size() << endl;
    for (const auto &s : students) {
        cout << s.id << " " << s.final_rank << " " << s.regionId << " " << s.local_rank << endl;
    }

    return 0;
}


一些心得

1、在处理地区排名时,使用了双指针,i是每个地区的起点,j遍历每个地区

2、先地区排名,再总排名