PAT A.1075 PAT Judge

题目叙述

PAT 的排名列表是从状态列表中生成的,它显示了提交的分数。这次您应该为 PAT 生成排名列表。
输入规格:
每个输入文件包含一个测试用例。对于每种情况,第一行包含 3 个正整数,N (≤10
​4
​​ ),用户总数, 至 (≤5),问题总数,以及 米 (≤10
​5
​​ ),提交总数。然后假设用户 ID 是 5 位数字,从 00001 到N,问题 id 从 1 到 至. 下一行包含至正整数p[i]( i=1, …,至),其中p[i]对应第 i 个问题的满分。然后米 后面几行,每行都以以下格式提供提交信息:

user_id problem_id partial_score_obtained
其中,partial_score_obtained要么是−1如果提交甚至无法通过编译器,或者是 [0, p[problem_id]]范围内的整数。一行中的所有数字都用空格分隔。

输出规格:
对于每个测试用例,您应该按以下格式输出排名列表:

rank user_id total_score s[1] … s[K]
其中rank根据 计算total_score,所有相同的用户total_score得到相同的rank;和s[i]是为第i-th 问题获得的部分分数。如果用户从未提交过问题的解决方案,则必须在相应位置打印“-”。如果用户提交了多个解决方案来解决一个问题,那么将计算最高分。

排名列表必须按排名的非递减顺序打印。对于排名相同的用户,必须按照完美解决问题的数量进行非升序排序。如果仍然有平局,则必须按其 id 的升序打印它们。对于从未提交过任何可以通过编译器的解决方案的人,或者从未提交过任何解决方案的人,他们不得出现在排名列表中。保证至少有一个用户可以显示在排名列表中。

这个题目bug真是无语了,书上的代码也是错的。主要是0分那个问题,没有回答题目的话不用显示,但是如果他有效回答了题目也就是出现在列表中,就算没有编译成功,也就是给出的-1.我们也要答了题目给的是0分。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

 const int maxn=10010;
 
 struct Student
 {
    int id;
    int score[6];
    bool flag;
    int sum;
    int solve;
}s[maxn];

int n,k,m;
int full[6];

bool cmp(Student a,Student b)
{
    if(a.sum!=b.sum)
        return a.sum>b.sum;
    else if(a.solve!=b.solve)
        return a.solve>b.solve;
    else
        return a.id<b.id;
}


int main()
{
    scanf("%d%d%d", &n,&k,&m);
    for(int i=1;i<=n;i++)
    {
        s[i].id=i;
        s[i].sum=0;
        s[i].solve=0;
        s[i].flag=false;
        memset(s[i].score,-1,sizeof(s[i].score));
    }
    for(int i=1;i<=k;i++)
        scanf("%d", &full[i]);
    int s_id,p_id,score_ob;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d", &s_id,&p_id,&score_ob);
        if(score_ob!=-1)
            s[s_id].flag=true;
        if(s[s_id].score[p_id]==-1)
            s[s_id].score[p_id]=0;
        if(score_ob==full[p_id]&& s[s_id].score[p_id]<full[p_id])
            s[s_id].solve++;
        if(score_ob>s[s_id].score[p_id])
            s[s_id].score[p_id]=score_ob;
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(s[i].score[j]!=-1)
                s[i].sum+=s[i].score[j];
        }
    }
    sort(s+1,s+n+1,cmp);
    int r=1;
    for(int i=1;i<=n && s[i].flag==true;i++)
    {
        if(i>1 && s[i].sum!=s[i-1].sum)
            r=i;
        printf("%d %05d %d",r,s[i].id,s[i].sum);
        for(int j=1;j<=k;j++)
        {
            if(s[i].score[j]==-1)
                printf(" -");
            else
                printf(" %d",s[i].score[j]);
        }
        printf("\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值