PAT A1075 PAT Judge (25point(s))

题目链接

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct user{
    int id;
    int score[10];//每道题的得分
    int totalscore;
    int perfectly_solve_num;
    int flag;//flag=1表示该用户有通过编译的解法
    user(){//构造函数对结构体初始化
        memset(score,-1,sizeof(score));//对每道题得分都初始化为-1
        flag=0;
        perfectly_solve_num=0;
        id=0;
        totalscore=0;
    }
}test[10010];
bool cmp(user a,user b){//排序函数
    if(a.flag!=b.flag) return a.flag>b.flag;//有编译通过的用户放在前面
    else if(a.totalscore!=b.totalscore) return a.totalscore>b.totalscore;//总分高的放前面
    else if(a.perfectly_solve_num!=b.perfectly_solve_num) return a.perfectly_solve_num>b.perfectly_solve_num;//满分通过数多的放前面
    else return a.id<b.id;//id小的放前面
}
int main(){
    user();//初始化
    int n,k,m,idnum,problemid,score_obtained;
    scanf("%d%d%d",&n,&k,&m);//输入用户数,题目数,提交数
    int p[10];//每道题的满分
    for(int i=1;i<=k;i++){
        scanf("%d",p+i);//
    }
    for(int i=0;i<m;i++){
        scanf("%d %d %d",&idnum,&problemid,&score_obtained);//输入用户id,题目id,所得分数
        if(test[idnum].id==0){//如果第一次进入id对应的结构体,要将id赋值
            test[idnum].id=idnum;
        }
        if(score_obtained!=-1){//通过编译
            test[idnum].flag=1;
        }
        if(score_obtained==-1&&test[idnum].score[problemid]==-1){//只有在第一次编译不通过时才会把该题目的分数置0,如果之前该题有编译成功的提交则不更新
            test[idnum].score[problemid]=0;
        }
        if(test[idnum].score[problemid]<p[problemid]&&score_obtained==p[problemid]){//某题第一次获得满分,满分解题数加1
         test[idnum].perfectly_solve_num++;
        }
        if(test[idnum].score[problemid]<score_obtained){//某题有更高分解法则覆盖低分解法
        test[idnum].score[problemid]=score_obtained;
        }
    }
    for(int i=1;i<=n;i++){//计算总分
            for(int j=1;j<=k;j++){
                    if(test[i].score[j]!=-1)
                test[i].totalscore+=test[i].score[j];
        }
    }
    sort(test+1,test+n+1,cmp);//排序,从1开始是因为用户的id是从00001到N
    int r=1;//当前排名
    for(int i=1;i<=n&&test[i].flag;i++){
       if(i>1&&test[i].totalscore!=test[i-1].totalscore){
         r=i;//若当前用户总分低于前一用户总分,则排名为该用户之前的用户数+1;否则用当前排名作为该生排名
    }
     printf("%d %05d %d",r,test[i].id,test[i].totalscore);
        for(int j=1;j<=k;j++){//输出每个题目的成绩
            if(test[i].score[j]==-1)//没有提交
            printf(" -");
            else printf(" %d",test[i].score[j]);
        }
        printf("\n");
    }
    return 0;
}
发布了81 篇原创文章 · 获赞 0 · 访问量 679

猜你喜欢

转载自blog.csdn.net/weixin_44546393/article/details/105328184