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

xiaoxiao2021-02-28  100

[声明]:由于本人在使用《算法笔记》的过程中有部分题解和《算法笔记》上的解法不同,特此作为记录,同时可以提供新的思路供读者参考; 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 d %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"); } }
转载请注明原文地址: https://www.6miu.com/read-47712.html

最新回复(0)