A1075

It is then assumed that the user id’s are 5-digit numbers from 00001 to N
题目一定要读清楚,少走很多歪路,没读清题目导致代码思路复杂,并且还有一个测试点过不了

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
struct node1{
	int uid;
	int score;
	int kind;
}stu[100001],student;
struct node2{
	int uid;
	int rank;
	int score[6];
	int res;
	bool flag[6];
}extract[100001];
bool cmp1(node1 a,node1 b){
	return a.uid<b.uid;
}
bool cmp2(node2 a,node2 b){
	if(a.score[0]!=b.score[0])return a.score[0]>b.score[0];
	else if(a.res!=b.res)return a.res>b.res;
	else return a.uid<b.uid;
}
int main(){
	#ifdef ONLINE_JUDGE
	#else
		freopen("1.txt","r",stdin);
	#endif 
	int n,k,m,ps[6]={0},kind=0;                                  //kind记录提交-1的问题号是多少,与issubmit配合使用 
	bool issubmit=false;                                         //记录之前是否有提交-1 
	scanf("%d%d%d",&n,&k,&m);
	for(int i=1;i<=k;i++)scanf("%d",&ps[i]);
	for(int i=0;i<m;i++)scanf("%d%d%d",&stu[i].uid,&stu[i].kind,&stu[i].score);
	sort(stu,stu+m,cmp1);
	int index=0;
	for(int i=0;i<m;i++){                                         //学生成绩整合筛选 
		student=stu[i];
		if(student.score!=-1){
			if(i==0){
				extract[index].uid=student.uid;
				extract[index].flag[student.kind]=true;
				extract[index].score[student.kind]=student.score;
				if(student.score==ps[student.kind])extract[index].res++;
				extract[index].score[0]=extract[index].score[0]+student.score;
			}
			if(student.uid==extract[index].uid){
				if(extract[index].flag[student.kind]){
					if(student.score>extract[index].score[student.kind]){
						extract[index].score[0]=extract[index].score[0]+student.score-extract[index].score[student.kind];
						extract[index].score[student.kind]=student.score;
						if(student.score==ps[student.kind])extract[index].res++;
					}
				}else{
					extract[index].flag[student.kind]=true;
					extract[index].score[student.kind]=student.score;
					if(student.score==ps[student.kind])extract[index].res++;
					extract[index].score[0]=extract[index].score[0]+student.score;
				}
				if(issubmit){
					extract[index].flag[kind]=true;
					issubmit=false;
				}
			}else{
				index++;
				extract[index].uid=student.uid;
				extract[index].flag[student.kind]=true;
				extract[index].score[student.kind]=student.score;
				if(student.score==ps[student.kind])extract[index].res++;
				extract[index].score[0]=extract[index].score[0]+student.score;
				if(issubmit)issubmit=false;
			}
		}else{
			if(extract[index].uid==student.uid){
				extract[index].flag[student.kind]=true;
			}else{
				issubmit=true;
				kind=student.kind;
			}
		}
	}
	sort(extract,extract+index+1,cmp2);                           //排序 
	extract[0].rank=1;
	for(int i=1;i<=index;i++){                                    //排名
		if(extract[i].score[0]!=extract[i-1].score[0])extract[i].rank=i+1;
		else extract[i].rank=extract[i-1].rank;
	}
	for(int i=0;i<=index;i++){                                    //输出 
		printf("%d %05d %d",extract[i].rank,extract[i].uid,extract[i].score[0]);
		for(int j=1;j<=k;j++){
			if(extract[i].flag[j]){
				printf(" %d",extract[i].score[j]);
			}else{
				printf(" -");
			}
		}
		printf("\n");
	}
	return 0;
}

算法笔记:
1、初始化结构体flag=false,考生至少存在一个问题能通过编译,才将flag=true。score数组置为-1,当考生对应题目的分数为-1时,则将score数组对应位置置0;当考生对应题目的分数非-1时,则去较大者赋给score数组对应位置。
2、一边读入考生数据,一边修改结构体数组中的数据
3、对结构体数组排序
4、得出考生对应的排名并输出(注:只输出flag=true即有通过编译的提交的考生)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
struct node{
	bool flag;
	int score[6];
	int fullnum;
	int id;
	int total;
}stu[10001];
void init(){
	for(int i=1;i<=n;i++){
		stu[i].flag=false;
		stu[i].id=i;
		memset(stu[i].score,-1,sizeof(stu[i].score));
	}
}
bool cmp(node a,node b){
	if(a.total!=b.total)return a.total>b.total;
	else if(a.fullnum!=b.fullnum)return a.fullnum>b.fullnum;
	else return a.id<b.id;
}
int main(){
	#ifdef ONLINE_JUDGE
	#else
		freopen("1.txt","r",stdin);
	#endif 
	int k,m,fscore[6],id,kind,score;
	scanf("%d%d%d",&n,&k,&m);
	init();
	for(int i=1;i<=k;i++)scanf("%d",&fscore[i]);
	for(int i=1;i<=m;i++){                                    //遍历每个考生提交的内容,分别整合到每个考生对应的一个结构体中 
		scanf("%d%d%d",&id,&kind,&score);
		if(score==-1&&stu[id].score[kind]==-1){               //某题第一次编译错误,分值记为0分,自己写的时候疏忽了,没有想到(因为若不是第一次编译错误,则不能将0覆盖掉原理的分数) 
			stu[id].score[kind]=0;
		}
		if(score!=-1){
			stu[id].flag=true;
		}
		if(score==fscore[kind]&&stu[id].score[kind]!=fscore[kind]){
			stu[id].fullnum++;
		}
		if(score>stu[id].score[kind]){
			stu[id].score[kind]=score;
		}
	}
	for(int i=1;i<=n;i++){                                //求得每个考生的总分 
		for(int j=1;j<=k;j++){
			if(stu[i].score[j]!=-1){
				stu[i].total+=stu[i].score[j];
			}
		}
	}
	sort(stu+1,stu+n+1,cmp);                              //注意:左闭右开
	int rank=1;                              
	for(int i=1;i<=n&&stu[i].flag==true;i++){             //计算排名并打印,跳过flag=false的考生 
		if(i!=1){
			if(stu[i].total!=stu[i-1].total)rank=i;
		}
		printf("%d %05d %d",rank,stu[i].id,stu[i].total);
		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;
}
A1075A1075 growthmindset 发布了26 篇原创文章 · 获赞 0 · 访问量 99 私信 关注
上一篇:eclipse项目中.classpath文件详解


下一篇:helm