1075 PAT Judge

Posted CSU迦叶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1075 PAT Judge相关的知识,希望对你有一定的参考价值。

1. 这一题一开始,为了同一个人的数据更新得方便,我把id从字符串转化成整数,作为数组下标,但是注意了,每个学生还是要有字符串的id属性(根据下标得到),因为后面一旦排序,数组下标就毫无意义了。

2.由于这里的很多下标都是从1开始,所以一定要注意循环的开始是1,结束要用小于等于符号

3.有一个一开始理解错的小点是,当一个人提交了但是编译没通过,该题输出的应该是0分而不是-

4.我把结构体中每道题的得分初始化为-2,是为了方便最后判断考生该题有没有提交

AC代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;

const int maxn = 100010;
const double eps = 1e-3;

struct tester{
	char id[6];
	int s[6] = {-2,-2,-2,-2,-2,-2};
	int s_total = 0;
	int fullMark_n[6] = {0};
	int f_total = 0;
	bool ifPrint = false;
	int rank = 0;
}testers[10010];

bool cmp(tester a,tester b){
	if(a.s_total!=b.s_total)return a.s_total>b.s_total;
	else if(a.f_total!=b.f_total)return a.f_total>b.f_total;
	else return strcmp(a.id,b.id)<0;
}

int main(){
	
	int testers_n = 0;//<=10^4
	int probs_n = 0;//<=5
	int subms_n = 0;//<=10^5
	int s[6] = {0};//每道题的分值
	
	scanf("%d %d %d",&testers_n,&probs_n,&subms_n);
	for(int i=1;i<=probs_n;i++){
		scanf("%d",&s[i]);
	}
	
	char idStr[6];//读到的id
	int id;//id转化为整数 
	int proNo;//读到的问题序号
	int score;//读到的得分 
	for(int i=1;i<=subms_n;i++){
		scanf("%s %d %d",idStr,&proNo,&score);
		sscanf(idStr,"%d",&id);
		//首先判断能否打印
		if(score>-1){
			testers[id].ifPrint = true;
			//再判断是否大于当前该生该题得分
			if(score>testers[id].s[proNo])testers[id].s[proNo] = score;
			//再判断该生该题得分是否为满分
			if(score==s[proNo])testers[id].fullMark_n[proNo] = 1;
		}else{
			//再判断是否大于当前该生该题得分
			if(score>testers[id].s[proNo])testers[id].s[proNo] = 0;//既然提交了就算编译没通过也是0而不是- 
		}
	}
	
	for(int i=1;i<=testers_n;i++){
		//算出每个学生的总分
		for(int j=1;j<=probs_n;j++){
			if(testers[i].s[j]!=-2){
				testers[i].s_total += testers[i].s[j];
			}
		}
		//算出每个学生满分的题数
		for(int j=1;j<=probs_n;j++){
			testers[i].f_total += testers[i].fullMark_n[j];
		}
		//将数组下标赋予给每个tester作为id,因为数组下标排序后就不起作用
		sprintf(testers[i].id,"%05d",i); 
	}
	
	sort(testers+1,testers+testers_n+1,cmp);
	
	testers[1].rank = 1;
	for(int i=2;i<=testers_n;i++){
		if(testers[i].ifPrint){
			if(testers[i].s_total==testers[i-1].s_total){
				testers[i].rank = testers[i-1].rank;
			}else{
				testers[i].rank = i;
			}
		}
	}
	
	for(int i=1;i<=testers_n;i++){
		if(testers[i].ifPrint){
			printf("%d %s %d",testers[i].rank,testers[i].id,testers[i].s_total);
			for(int j=1;j<=probs_n;j++){
				if(testers[i].s[j]!=-2)printf(" %d",testers[i].s[j]);
				else printf(" -",testers[i].s[j]);
			}
			printf("\\n");
		}
	}
	
	
}

以上是关于1075 PAT Judge的主要内容,如果未能解决你的问题,请参考以下文章

PAT 1075.PAT Judge

PAT 1075. PAT Judge

PAT(A) 1075. PAT Judge (25)

1075 PAT Judge

1075. PAT Judge (25)

1075. PAT Judge (25)