PAT题解——1075. PAT Judge (25)

来源:互联网 发布:京东疯狂的美工倒计时 编辑:程序博客网 时间:2024/05/02 06:45

[声明]:由于本人在使用《算法笔记》的过程中有部分题解和《算法笔记》上的解法不同,特此作为记录,同时可以提供新的思路供读者参考;
1. 题目链接:https://www.patest.cn/contests/pat-a-practise/1075
2. 解题思路:由于同一个user_id可能有多次的记录,所以将结构体数组下标看做id; 每个结构体中记录每题的得分、用户ID(用于输出)、总分、排名、满分题目的数量;注意最后输出的有效用户的数目的判断(见下面用于记录有效用户数量的outnum变量的说明);
3. AC代码:

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=10010;//由于同一个user_id可能有多次的记录,所以将数组下标看做id; struct u{    int id;  //由于后边还要输出排序后的id,此时数组下标和对应的Id就相等了,所以需要保存id;     int score[5];  //每道题目获得的分数     int total;  //记录总分,用于排序     int count;  //记录有满分的题目数目,用于排序     int rank;   //记录排名,用于输出 }user[maxn];bool cmp(u a,u b){    if(a.total!=b.total) return a.total>b.total;    else if(a.count!=b.count) return a.count>b.count;    return a.id<b.id;}int main(){    int N,K,M; int outnum=0; //outnum用于计算符合条件,即至少有一题编译成功的人的数目     int s[5];    scanf("%d%d%d",&N,&K,&M);    for(int i=0;i<K;i++) scanf("%d",&s[i]); //输入每题的满分     //初始化:用户每题的初试得分为-2(表示没提交过),总分total为0,id为序号(对应序号没有的人也要参与排序)     for(int i=1;i<=N;i++){         for(int j=0;j<K;j++) user[i].score[j]=-2;         user[i].total=0;        user[i].id=i;    }    int temp_id;int num,temp_s; //分别表示用户id、题目编号、得分     for(int i=0;i<M;i++){        scanf("%d%d%d",&temp_id,&num,&temp_s);        if(temp_s>user[temp_id].score[num-1]) user[temp_id].score[num-1]=temp_s; //一题可能有多次提交得分,选择最大的得分做记录         user[temp_id].id=temp_id;      }    //用于计算总分和每个用户满分题目的数量     for(int i=1;i<=N;i++){        for(int j=0;j<K;j++){            if(user[i].score[j]==-1||user[i].score[j]==-2); //如果没有编译成功或者未提交,total不加分             else user[i].total+=user[i].score[j];            if(user[i].score[j]==s[j]) ++user[i].count; //满分题目的数量         }        for(int j=0;j<K;j++){            if(user[i].score[j]>=0){  //只要该用户中有题目得分大于等于0分即表示该用户是有效用户,可用于输出排名                 ++outnum;                break;            }        }    }    //进行排名;优先级:总分>满分题目数量>用户Id     sort(user+1,user+N+1,cmp); //注意从第一个序号为00001的开始排序,有N个人     user[1].rank=1;    for(int i=2;i<=N;i++){        if(user[i].total ==user[i-1].total) user[i].rank=user[i-1].rank;        else user[i].rank=i;    }    //按要求输出排序     for(int i=1;i<=outnum;i++){        printf("%d %05d %d",user[i].rank,user[i].id,user[i].total);         for(int j=0;j<K;j++){ //输出每题的得分             if(user[i].score[j]==-1) printf(" 0"); //编译错误             else if(user[i].score[j]==-2) printf(" -");  //未提交             else printf(" %d",user[i].score[j]); //得分         }        printf("\n");    }}
原创粉丝点击