题目

解法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、先地区排名,再总排名
浙公网安备 33010602011771号