PAT(上級レベル)実践1075 PAT判事(25ポイント)[ソート]

PATのranklistは提出のスコアを示すステータスリストから生成されます。この時間は、あなたはPATのためにranklistを生成することになっています。

入力仕様:

各入力ファイルには、1つのテストケースが含まれています。各場合について、最初の行は、3つの正の整数を含みます、 N ( 1 0 4 ) N(≤10^ 4) 、ユーザーの総数は、 K ( 5 ) K(≤5) 、問題の総数、および M ( 1 0 5 ) M(≤10^ 5) 、投稿の総数。次に、それをユーザーIDのは、00001からに5桁の数字であると仮定する N N 、および問題のIDは1からにしています K K 次の行は含まれてい K K 正の整数p[i]i= 1、...、 K K )、p[i]i番目の問題の完全なマークに対応しています。それから M M 行は、それぞれが次の形式で提出の情報を提供し、従います。

user_id problem_id partial_score_obtained

ここで、partial_score_obtained[0、提出もコンパイラを渡すことができない場合は-1のいずれかである、または範囲内の整数ですp[problem_id]]。行のすべての数字は、スペースで区切られます。

出力仕様:

各テストケースについて、あなたは次の形式でranklist出力になっています。

rank user_id total_score s[1] ... s[K]

場合rankに応じて算出されtotal_score、同一の持つすべてのユーザがtotal_score同じを得ますrankそしてs[i]について得られた部分的なスコアであるi番目の問題。ユーザーが問題の解決策を提出したことがない場合は、「 - 」は、対応する位置に印刷されなければなりません。ユーザーが1つの問題を解決するには、いくつかの解決策を提出した場合、最も高いスコアがカウントされます。

ranklistはランクの非減少順に印刷されなければなりません。同じランクを持っている人のために、ユーザーが完全に解決される問題の数に応じて非増加順にソートする必要があります。タイがまだあるなら、彼らは自分のIDのの昇順で印刷しなければなりません。コンパイラを渡すことができます任意のソリューションを提出したことがない、または任意の解決策を提出したことがない人のために、彼らはranklistに示されてはいけません。少なくとも1人のユーザがranklistに示すことができることが保証されます。

サンプル入力:

7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4 -1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2 -1
00004 2 0

サンプル出力:

1 00002 63 20 25 - 18
2 00005 42 20 0 22 -
2 00007 42 - 25 - 17
2 00001 42 18 18 4 2
5 00004 40 15 0 25 -

問題の意味

ユーザーの数:N、タイトルの数:K、提出番号:M. スコアは、各質問のために与えられ、すべてのレコードを提出しています。出力は、ランク付けの合計スコアで計算されたリストを、ランク付けしました。すべての応募の最大値を取るために各質問のスコア。同ランキングした場合、あなたはまだ区別できない場合は、ソートの数に応じて、トピックから抜け出すためには、ユーザーIDに基づいてソート。ユーザーはリストには表示されませんランキングをコンパイルする任意のコードを提出していません。

思考

ユーザーが読み得点と総得点のために各質問を計算し、また、ランキングリストにユーザーが表示さを記録するための変数を必要としています。ご注文後、計算して出力位。

コード

#include <algorithm>
#include <cstdio>

using namespace std;

struct User {
    int user_id;
    int final_score[6] = {-1, -1, -1, -1, -1, -1}; // -1代表用户没提交过
    int total_score = 0;
    int full_mark_cnt = 0;
    bool show = false;
} users[10005];

int full_mark[5];

int main() {
    int n, k, m;
    scanf("%d %d %d\n", &n, &k, &m);

    for (int i = 1; i <= n; ++i) // 设置用户id
        users[i].user_id = i;
    for (int i = 1; i <= k; ++i) // 读入每道题的满分
        scanf("%d", &full_mark[i]);
    for (int i = 0; i < m; ++i) {
        int user_id, problem_id, obtained_score;
        scanf("%d %d %d\n", &user_id, &problem_id, &obtained_score); // 读入一个提交

        User &user = users[user_id];
        int &final_score = user.final_score[problem_id];
        final_score = max(final_score, 0);
        if (obtained_score >= 0)
            user.show = true;
        if (final_score < obtained_score) { // 更新用户的分数
            user.total_score += obtained_score - final_score;
            if (obtained_score == full_mark[problem_id])
                user.full_mark_cnt++;
            final_score = obtained_score;
        }
    }

    sort(users + 1, users + 1 + n, [](User &a, User &b) {
        if (a.show != b.show)
            return a.show > b.show;
        else if (a.total_score != b.total_score)
            return a.total_score > b.total_score;
        else if (a.full_mark_cnt != b.full_mark_cnt)
            return a.full_mark_cnt > b.full_mark_cnt;
        else
            return a.user_id < b.user_id;
    });

    int cnt = 0, rank = 0, last_sum = -1;
    for (int i = 1; i <= n && users[i].show; ++i) {
        ++cnt;
        if (last_sum != users[i].total_score) {
            rank = cnt;
            last_sum = users[i].total_score;
        }
        printf("%d %05d %d ", rank, users[i].user_id, users[i].total_score);
        for (int j = 1; j <= k; ++j) {
            if (users[i].final_score[j] >= 0)
                printf("%d", users[i].final_score[j]);
            else
                printf("-");
            if (j != k)
                printf(" ");
        }
        printf("\n");
    }
}
公開された184元の記事 ウォン称賛19 ビュー20000 +

おすすめ

転載: blog.csdn.net/Exupery_/article/details/104255598