前言
正文
参考题解
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
/* 模拟PAT的判题得分,得出成绩列表 首先输入n,k,m,表示n个用户,k个问题以及m次提交 接下来是k个问题各自满分是多少 随后是m次提交信息,每个提交信息包括用户Id(1~n),本次提交所对应的问题Id(1~k),以及在该题的得分score 注意事项: 1、若score为-1,则表示提交没有通过编译器,若某个用户提交的题解得分均为-1,则最后的排名列表不要显示该用户 2、输出格式是:排名 用户Id 总得分 k道题各自对应的得分 这里注意每道题对应的得分,若用户从未提交过题解,则输出'-', 若之前提交的score为-1,这里输出的是0;同时需要注意若一个用户多次提交,则取多次提交中得分最高的一次 3、最后注意排序规则,首先按照总分降序排序,总分相同的用户排名相同, 而总分相同的用户排序首先看完全解答出的题目的数目 (也就是得满分的题目的数量),按其降序排序,若完全解答出的题目的数量相同,则按照用户id升序排序 解题思路: 做这种排序题,首先根据排序规则和输出格式确定结构体中的成员变量应该有 用户Id,总分,各题的得分,完美解答出题目的数量, 是否有通过编译的题解。(由于输入输出较多,因此尽量使用scanf和printf) */
const int N=1e4+10;
struct Student{
int uid;
int total_score=0;
int score[6];
int cnt;//完美解决题目的数量
bool flag;//是否提交过题解
}stu[N];
int n,k,m,p[6];
//排序规则
bool cmp(Student a,Student b){
if(a.total_score!=b.total_score)return a.total_score>b.total_score;
else if(a.cnt!=b.cnt)return a.cnt>b.cnt;
else return a.uid<b.uid;
}
//初始化操作
void init(){
for(int i=1;i<=n;i++){
stu[i].uid=i;
stu[i].total_score=0;
memset(stu[i].score,-1,sizeof(stu[i].score));//为了后面便于输出'-',这里所有题目初始设置-1表示均未提交过
stu[i].cnt=0;
stu[i].flag=false;//未提交过一次题解
}
}
int main(){
scanf("%d%d%d",&n,&k,&m);
init();
for(int i=1;i<=k;i++)scanf("%d",&p[i]);
int u_id,p_id,u_score;
for(int i=0;i<m;i++){
scanf("%d%d%d",&u_id,&p_id,&u_score);
if(u_score!=-1)stu[u_id].flag=true;//该用户有提交过题解,需要最终输出
if(u_score==-1&&stu[u_id].score[p_id]==-1)stu[u_id].score[p_id]=0;
//注意用户首次满分时才cnt++ ,同时注意语句顺序,必须写在更新分数最大值语句之前
if(u_score==p[p_id]&&stu[u_id].score[p_id]<u_score)stu[u_id].cnt++;
if(u_score>stu[u_id].score[p_id])stu[u_id].score[p_id]=u_score;//出现更高的分数,则覆盖之前的分数
}
// 计算总分
for(int i=1;i<=n;i++){
for(int j=1;j<=k;j++){
if(stu[i].score[j]!=-1)stu[i].total_score+=stu[i].score[j];
}
}
sort(stu+1,stu+1+n,cmp);
// 输出
int cur_rank=1;
for(int i=1;i<=n&&stu[i].flag==true;i++){
if(i>1&&stu[i].total_score!=stu[i-1].total_score)cur_rank=i;
printf("%d %05d %d",cur_rank,stu[i].uid,stu[i].total_score);
for(int j=1;j<=k;j++){
if(stu[i].score[j]==-1)printf(" -");
else printf(" %d",stu[i].score[j]);
}
printf("\n");
}
return 0;
}