【PAT-A】1075. PAT Judge 写题记录

主要是用结构体来做,注意统计规则,有0分及0分以上的提交,总的算有效提交,其余的算无效提交(编译错误题目算提交过)

①提交得0分,题目得0分,算有效提交

②提交得-1分,题目算0分,但只算无效提交

③没有提交过,题目算“-”

其他方面就是准考证从0开始,因而sort(user,user+10000,cmp)是不对的,最后一个测试点通不过

改成sort(user,user+10001,cmp)即可通过。但实际上准考证是[1,N],故sort(user+1,user+n+1,cmp)即可。

注意满分数不要重复记录

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct user{
	int userid;  //记录ID,因为排序后顺序会乱掉 
	int problem_score[5]={0};  //所有的初始分为0分 
	int total_score=0;  //总分 
	int range=0;  //排名 
	int perfect_num=0;  //满分数 
	bool flag[5]={false};  // 看题目有没有提交,编译不过也算提交过 
	bool sub = false;  //是否是有效提交 
}users[10020];
int k,mark[5]; //cmp要用到,故写到全局 
bool cmp(user a,user b){
	if (a.sub!=b.sub) return a.sub>b.sub;  //排序先排有没有有效提交 ,再按总分、满分数、ID排 
	else if (a.total_score!=b.total_score) return a.total_score>b.total_score;
	else if (a.perfect_num!=b.perfect_num) return a.perfect_num>b.perfect_num;	
	else return a.userid<b.userid;
}
int main(){
	int n,k,m;
	scanf("%d%d%d",&n,&k,&m);

	for (int i=0;i<k;i++){ //读取题目分值 
		scanf("%d",&mark[i]);
	}
	for (int i=0;i<m;i++){
		int userid,proid,prosc;
		scanf("%d%d%d",&userid,&proid,&prosc);   
		users[userid].userid=userid; //保存题目ID 
		if (users[userid].problem_score[proid-1]<prosc) {  
		//如果分数高,就更新,注意如果写<=,会产生满分数重复的情况,所以写<,
		//但写了<,0分无法记录,所以0单独考虑 
			if (prosc==mark[proid-1]) users[userid].perfect_num++;  //记录满分数 
			users[userid].total_score-=users[userid].problem_score[proid-1];  //总分先减去之前的分值 
			users[userid].problem_score[proid-1]=prosc; //更新分数 
			users[userid].total_score+=users[userid].problem_score[proid-1]; // 总分更新 
			users[userid].flag[proid-1]=true; //此题算提交 
			users[userid].sub=true; //总的算有效提交 
		}
		else if(prosc==0){ //0分的话,分值不更新,但其余算有效提交 
			users[userid].flag[proid-1]=true;
			users[userid].sub=true;			
		}
		else if (prosc==-1){ //编译错误,只有题目算提交过,其余不变 
			users[userid].flag[proid-1]=true;
		}
	}
	sort(users+1,users+n+1,cmp); //users[0]是空的,故从user[1]开始,故为n+1 
	users[1].range=1;
	printf("%d %05d %d",users[1].range,users[1].userid,users[1].total_score);
	for (int i=0;i<k;i++){
		if (users[1].flag[i]==false) printf(" -");
		else printf(" %d",users[1].problem_score[i]);
	}
	printf("\n");
	for (int i=2;i<=n;i++){
		if (users[i].sub==false) break;
		if(users[i].total_score==users[i-1].total_score) users[i].range=users[i-1].range;
		else users[i].range = i;
		printf("%d %05d %d",users[i].range,users[i].userid,users[i].total_score);
		for (int j=0;j<k;j++){
			if (users[i].flag[j]==false) printf(" -");
			else printf(" %d",users[i].problem_score[j]);
		}
		printf("\n");		
	}
	return 0;
} 

猜你喜欢

转载自blog.csdn.net/weixin_43456345/article/details/85322445