PAT A1075 PAT Judge

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <ctype.h>

using namespace std;

typedef struct
{
    int id;
    int score[6];//最多5门
    int total;
    int flag;//是否通过编译或者提交过答案
    int pft;
}Node;

int compare(Node a,Node b)
{
    if(a.flag!=b.flag)return a.flag>b.flag;
    else if(a.total!=b.total)return a.total>b.total;
    else if(a.pft!=b.pft)return a.pft>b.pft;
    else return a.id<b.id;
}

int main()
{
   // freopen("input.txt","r",stdin);
    int n,k,m;
    int i;
    int id,pb,score;
    scanf("%d%d%d",&n,&k,&m);//
    int full[k+1];
    Node user[n+1];
    for(i=1;i<=n;i++)
    {
        user[i].id=i;
        user[i].flag=0;
        user[i].total=0;//初始化
        user[i].pft=0;//完美解答数目为0
        fill(user[i].score,user[i].score+6,-1);
    }//初始化所有数组
    for(i=1;i<=k;i++)
    {
        scanf("%d",full+i);//得到满分成绩
    }
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&id,&pb,&score);
        if(user[id].score[pb]==-1&&score==-1)
        {
            user[id].score[pb]=0;//只要提交过就更新为0
        }
        else if(user[id].score[pb]<score)
        {
            user[id].score[pb]=score;//更新数组
            user[id].flag=1;//表示更新过可以参与排名和显示
            if(score==full[pb])user[id].pft++;//完美解答数加1
        }
    }
    for(i=1;i<=n;i++)
    {
        for(int j=1;j<=k;j++)
        {
            if(user[i].score[j]!=-1)user[i].total+=user[i].score[j];
        }
    }
    sort(user+1,user+n+1,compare);
    int level=1,count=1;
    for(i=1;i<=n;i++)
    {
        if(user[i].flag==0)break;
        printf("%d ",level);//得到level;
        printf("%05d %d ",user[i].id,user[i].total);
        for(int j=1;j<=k;j++)
        {
            if(user[i].score[j]!=-1)
            {
                printf("%d",user[i].score[j]);//
            }
            else printf("-");
            if(j<k)printf(" ");
        }
        printf("\n");
        if(i<n&&user[i].total==user[i+1].total)
        {
            count++;
        }
        else{
            level+=count;
            count=1;
        }

    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值