1075 PAT Judge (25 分)测试点4修正

本文介绍了一个竞赛评分系统的实现细节,包括学生信息结构定义、输入处理、成绩计算与排名确定等关键步骤。通过C++代码展示了如何处理多个问题的提交、计算总分及完美解答数量,并最终按特定规则对学生进行排名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <bits/stdc++.h>

using namespace std;

const int maxn = 10010;
const int maxpro = 6;

//结构体初始化
struct student {
	int id;
	int scr[maxpro];///每门课程的得分情况
	int tol_scr;///总分
	int cnt ;///说明该考生至少提交过一题
	int perfect_pro;///完美解题数
	int rank_;///排名
}stu[maxn];
int problem_full[maxpro]={0};///每门课程的满分值

bool cmp(const student &a,const student &b) {
	if (a.tol_scr!=b.tol_scr)
		return a.tol_scr>b.tol_scr;
	else if (a.perfect_pro!=b.perfect_pro)
		return a.perfect_pro>b.perfect_pro;
	else
		return a.id<b.id;
}
/*

用户数N,问题总数K,总提交数M


*/

int main() {
	int n, k, m;
	scanf("%d%d%d",&n,&k,&m);
	for (int i=1;i<=k;i++) {
        scanf("%d",&problem_full[i]);
	}
	///不用非得记录考生的id,输出时,按照格式输出即可
	for (int i=1;i<maxn;i++){
		stu[i].id = i;
		stu[i].perfect_pro=0;
		stu[i].cnt=0;
		stu[i].tol_scr=0;
		fill(stu[i].scr,stu[i].scr+maxpro,-1);
	}
	for (int i=0;i<m;i++) {
		int tmp,num,score;
		scanf("%d%d%d",&tmp,&num,&score);
		if (score==-1){///说明提交过
            if(stu[tmp].scr[num]==-1)///必须得加这句,否则会覆盖之前的得分
			    stu[tmp].scr[num]=0;
		}
		else {///存在满分情况,多次提交,计算完美解题数,就不能在这里面计算
			//if (problem_full[num] == score) {
		//		stu[tmp].perfect_pro++;
		//	}
			if(score>stu[tmp].scr[num])///更新最大分数
				stu[tmp].scr[num]=score;
			stu[tmp].cnt++;
		}
	}

	for (int i=1;i<=n;i++) {
		for (int j=1;j<=k;j++) {
			if (stu[i].scr[j]!=-1) ///计算学生总成绩和最佳解题数
				stu[i].tol_scr+=stu[i].scr[j];
			if(stu[i].scr[j]==problem_full[j])///更新该学生 完美题解数
                stu[i].perfect_pro++;
		}
	}
	sort(stu+1,stu+n+1,cmp);
	stu[1].rank_=1;
	for (int i=2;i<=n;i++) {///计算排名
        //if (stu[i].cnt){
            if(stu[i].tol_scr!=stu[i- 1].tol_scr)
                stu[i].rank_=i;
            else
                stu[i].rank_=stu[i-1].rank_;
        //}
	}
	for (int i=1;i<=n;i++) {
		if (stu[i].cnt){///学生至少提交过一次解题,可以不是满分,但不能是-1分
			printf("%d %05d %d", stu[i].rank_,stu[i].id,stu[i].tol_scr);
			for (int j=1;j<=k;j++) {
				if (stu[i].scr[j]==-1)
					printf(" -");
				else
					printf(" %d", stu[i].scr[j]);
			}
			printf("\n");
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值