PAT-A 1075 PAT Judge (25 分)

PAT 的排名列表是根据状态列表产生的,状态列表中显示了所有提交记录的分数。

现在,请你为 PAT 生成排名列表。

输入格式
第一行包含三个整数 N,K,M,分别表示总用户数量,题目数量,以及提交数量。

用户编号是从 00001 到 N 的 5 位数字。

问题编号从 1 到 K。

第二行包含 K 个整数 p1,p2,…,pK,其中 pi 表示第 i 题的满分。

接下来 M 行,每行包含一个提交信息,包括用户编号,题目编号,以及得分。

当提交无法正确编译时,得分显示 −1,否则是一个 [0,该题满分] 范围内的整数。

注意,无法编译的情况虽然显示 −1,但得分上算作 0 分。

输出格式
以下列格式输出排名列表:

rank user_id total_score s[1] … s[K]
其中,rank 是根据 total_score 计算的,所以拥有相同 total_score 的用户的 rank 也相同。

s[i] 是第 i 个问题获得的分数。

如果某个问题,用户从未提交过代码,则用 - 来表示这道题的分数。

如果某个问题,用户多次提交过代码,则取最高分为这道题的分数。

列表必须根据排名从前到后输出,对于排名相同的用户,根据满分题目的数量以降序对用户排序,如果仍有排名相同的情况,则按 ID 升序的顺序排序。

对于从未提交过任何代码,或者从未提交过任何编译通过的代码的用户,输出时不予考虑。

数据范围
1≤N≤104,
1≤K≤5,
1≤M≤105
每道题的满分为不超过 30。

输入样例:
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 -

思路都在代码中了hh…

#include <bits/stdc++.h>

using namespace std;
struct node
{
    int score[6]={0};//每个题的最大分
    int flag[6]={0};//每个题是否编译通过
    int total=0;//总分
    int putt=0;//是否输出
    int cnt=0;//满分的个数
    int id;
    
}a[10011];
int n,m,k;
int que[6];
bool cmp(node&a,node&b)
{
    if(a.total!=b.total)
    return a.total>b.total;
    if(a.cnt!=b.cnt)
    return a.cnt>b.cnt;
    return a.id<b.id;
}
int main()
{
    cin >> n >>k >>m;
    for(int i=1;i<=n;i++)
    a[i].id=i;
    for(int i=1;i<=k;i++)
    cin >>que[i];
    for(int i=1;i<=m;i++)
    {
        int x,y,z;
        cin >> x >>y >>z;//id,题目号,分数
        
        if(a[x].score[y]<=z)//大于等于零也可以
        {
            a[x].total=a[x].total-a[x].score[y]+z;//更新总分
            a[x].score[y]=z;//更新这个题的分数
            a[x].flag[y] = 1;//这个题提交成功过
            a[x].putt = 1;//可以输出这个人了
        }
        else if(z==-1)
        {
            a[x].flag[y] = 1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(a[i].score[j]==que[j])
            a[i].cnt++;
        }
    }
    sort(a+1,a+1+n,cmp);
    int cnt=0;
    int num=1;
    for(int i=1;i<=n;i++)
    {
         if(a[i].putt)
         {
             cnt++;
             if(a[num].total!=a[i].total)
             num=cnt;
             printf("%d %05d %d",num,a[i].id,a[i].total);
             for(int j=1;j<=k;j++)
             {
                 if(a[i].flag[j])
                 printf(" %d",a[i].score[j]);
                 else
                 printf(" -");
             }
             cout <<endl;
         }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值