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"); }}
阅读全文
0 0
- PAT题解——1075. PAT Judge (25)
- PAT 1075. PAT Judge (25)
- PAT 1075. PAT Judge (25)
- 【PAT】1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- 1075. PAT Judge (25)
- log4J 最简单的应用
- 错排公式
- 从零开始的uboot系统移植5
- JVM学习笔记(8)-锁优化技术
- VECTOR中pair的排序
- PAT题解——1075. PAT Judge (25)
- PAT 乙级 1023.组个最小数(20)
- 基础数论算法(2) GCD LCM EXGCD 学习笔记
- Class类文件结构
- Office2013 完美激活
- Day3:msfconsole控制台终端
- Element UI 自定义正则表达式验证
- hexo的Next创建categories
- 金融企业软件测试中心筹备书-全生命周期管理篇