前言

传送门

正文

参考题解


#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;
}