A1075 PAT Judge (25 分)(根据提交信息排序)(难)

Input Specification:

每个输入文件包含一个测试用例。对于每种情况,第一行包含3个正整数,n(≤10^4) 用户总数,k(≤5)问题总数,m(≤10^5)提交的总数。然后假设用户ID是从00001到N的5位数字,问题ID是从1到K。

下一行包含k个正整数p[i](i=1,…,k),其中p[i]对应第i个问题的满分。然后是M行,每个行以以下格式提供提交的信息:

user_id problem_id partial_score_obtained

其中,如果提交的内容甚至不能通过编译器,则获得的部分分数为−1,或者是范围[0,p[问题\ id]内的整数。一行中的所有数字都用空格隔开。

Output Specification:

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

将用户的总分进行排名. 其中排名是根据总分计算的,所有总分相同的用户都获得相同的等级。如果用户从未提交过问题的解决方案,则必须在相应位置打印“-”。如果用户提交了多个解决方案来解决一个问题,则将计算最高分数。

必须按军衔的非递减顺序打印ranklist。对于同一级别的用户,必须根据完全解决的问题的数量,以不增加的顺序对用户进行排序。如果仍然有一个结,则必须按其ID的递增顺序打印。

对于从未提交过任何可以通过编译器的解决方案或从未提交过任何解决方案的人,不得在ranklist上显示它们。可以保证在ranklist上至少显示一个用户。

Sample Input:

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

Sample Output:

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 -

 思路:

题目最终会按照总分、完美解题数、ID来排序,因此结构体中定义id, score[6]分别存储每一道题的分数、score_all 总分、完美解题数solve,另外还有flag记录是否有能够通过编译的提交(因为题目不会输出没有能够通过编译的提交)。

考生分为:

  1. 全场都没有提交
  2. 没有能够通过编译的提交
  3. 有能通过编译的提交

因此score初始化为-1, 表示没有提交; 0表示无法通过编译,同时可以用于计算总成绩

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 100010;
struct Student{
    int id;
    int score[6];
    bool flag;
    int score_all;
    int solve;
}stu[maxn];
int n, k, m;
int full[6];
bool cmp(Student a, Student b) {
    if(a.score_all != b.score_all) {
        return a.score_all > b.score_all;
    } else if(a.solve != b.solve) {
        return a.solve > b.solve;
    } else {
        return a.id < b.id;
    }
}
void init() {
    for(int i = 1; i <= n; i++) {
        stu[i].id = i;
        stu[i].score_all = 0;
        stu[i].solve = 0;
        stu[i].flag = false;
        memset(stu[i].score, -1, sizeof(stu[i].score));
    }
}
int main() {
    scanf("%d %d %d", &n, &k, &m);
    init();
    for(int i = 1; i <= k; i++) {
        scanf("%d", &full[i]);
    }
    int u_id, p_id, score_get;
    for(int i = 0; i < m; i++) {
        scanf("%d%d%d", &u_id, &p_id, &score_get);
        if(score_get != -1) {
            stu[u_id].flag = true;
        }
        if(score_get == -1 && stu[u_id].score[p_id] == -1) {
            stu[u_id].score[p_id] = 0;
        }
        if(score_get == full[p_id] && stu[u_id].score[p_id] < full[p_id]) {
            stu[u_id].solve++;
        }
        if(score_get > stu[u_id].score[p_id]) {
            stu[u_id].score[p_id] = score_get;
        }
    }
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= k; j++) {
            if(stu[i].score[j] != -1) {
                stu[i].score_all += stu[i].score[j];
            }
        }
    }
    sort(stu + 1, stu + n + 1, cmp);
    int currank = 1;
    for(int i = 1; i <= n && stu[i].flag == true; i++) {
        if(i > 1 && stu[i].score_all != stu[i-1].score_all) {
            currank = i;
        }
        printf("%d %05d %d", currank, stu[i].id, stu[i].score_all);
        for(int j = 1; j <= k; j++) {
            if(stu[i].score[j] == -1) {
                printf(" -");
            } else {
                printf(" %d", stu[i].score[j]);
            }
        }
        printf("\n");
    }
    return 0;
}

 

展开阅读全文

没有更多推荐了,返回首页