1075. PAT Judge (25)

本文介绍了一个竞赛编程中的排名系统实现方案,通过结构体存储参赛者的ID、每道题目的得分等信息,并使用自定义比较函数进行排序,最终输出每位参赛者的排名及详细得分情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>

#include <cstring>

using namespace std;

int N,K,M;
int mp[10];//每题的分值

struct node
{
    int id;
    int score[10];
    int perfect;
    int sum;
    int rankk;
}T[10005];

void init()
{
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=K;j++)
        {
            T[i].score[j] = -2;//-2表示没有提交过,-1表示提交过编译失败的代码,0表示提交过编译成功但是没得分的代码
        }
        T[i].perfect=0;
        T[i].sum=0;
        T[i].id=i;
    }
}

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

bool fun(node a)//判断a是不是满足:所有题目都是-2或-1?若是,他就可以被忽略了
{
    int flag=0;
    for(int i=1;i<=K;i++)
    {
        if(a.score[i]>=0)
            flag++;
    }

    if(flag!=0)
        return false;
    else
        return true;
}

void pr(int t)
{
    if(t==-2)
        printf(" -");
    else if(t==-1)
        printf(" 0");
    else
        printf(" %d",t);
}

int main()
{
//    freopen("in.txt","r",stdin);

    scanf("%d %d %d",&N,&K,&M);
    init();//初始化
    for(int i=1;i<=K;i++)
        scanf("%d",&mp[i]);

    for(int i=0;i<M;i++)//给每个人的每题得分赋值
    {
        int tid,tnum,tscore;
        scanf("%d %d %d",&tid,&tnum,&tscore);
        if(tscore > T[tid].score[tnum])
            T[tid].score[tnum]=tscore;
    }

    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=K;j++)
        {
            if(T[i].score[j]>0)
                T[i].sum+=T[i].score[j];
        }

        for(int j=1;j<=K;j++)
        {
            if(T[i].score[j]==mp[j])
                T[i].perfect++;
        }
    }

    sort(T+1,T+1+N,cmp);

    T[1].rankk=1;
    for(int i=2;i<=N;i++)//给排名赋值
        if(T[i].sum==T[i-1].sum)
            T[i].rankk=T[i-1].rankk;
        else
            T[i].rankk=i;

    for(int i=1;i<=N;i++)
    {
        if(fun(T[i])==true)
            continue;

        printf("%d %05d %d",T[i].rankk,T[i].id,T[i].sum);
        for(int j=1;j<=K;j++)
            pr(T[i].score[j]);//控制输出格式
        printf("\n");
    }











    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值