Java
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;
class Student implements Comparable<Student> {
String id;
int grade;
int locationNumber;
int localRank;
int finalRank;
Student(String id, int grade, int locationNumber) {
this.id = id;
this.grade = grade;
this.locationNumber = locationNumber;
}
@Override
public int compareTo(Student t) {
if (this.grade != t.grade) {
return t.grade - this.grade; // Descending order
}
return this.id.compareTo(t.id);
}
}
/**
* 测试点3超时
*/
public class Main {
static final int N = 110;
static List<Student>[] grades = new ArrayList[N];
static List<Student> all = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
for (int i = 0; i < N; i++) {
grades[i] = new ArrayList<>();
}
int n = Integer.parseInt(br.readLine());
for (int i = 1; i <= n; i++) {
int k = Integer.parseInt(br.readLine());
for (int j = 0; j < k; j++) {
String[] input = br.readLine().split(" ");
String id = input[0];
int grade = Integer.parseInt(input[1]);
grades[i].add(new Student(id, grade, i));
}
Collections.sort(grades[i]);
for (int j = 0; j < grades[i].size(); j++) {
if (j == 0 || grades[i].get(j).grade != grades[i].get(j - 1).grade) {
grades[i].get(j).localRank = j + 1;
} else {
grades[i].get(j).localRank = grades[i].get(j - 1).localRank;
}
all.add(grades[i].get(j));
}
}
Collections.sort(all);
for (int i = 0; i < all.size(); i++) {
if (i == 0 || all.get(i).grade != all.get(i - 1).grade) {
all.get(i).finalRank = i + 1;
} else {
all.get(i).finalRank = all.get(i - 1).finalRank;
}
}
System.out.println(all.size());
for (Student s : all) {
System.out.println(s.id + " " + s.finalRank + " " + s.locationNumber + " " + s.localRank);
}
}
}
C++
#include <iostream>
#include <cstring>
#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;
string id;
for (int j = 0; j < k; j++) {
int grade;
cin >> id >> grade;
grades[i].push_back({id, grade, i});
}
auto &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 (auto &s: all)
cout << s.id << ' ' << s.final_rank << ' ' << s.location_number << ' ' << s.local_rank << endl;
return 0;
}