⬆︎
×

[PAT-A] 1025 PAT Ranking

Hyplus目录

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;
}

发表评论