pat 甲级 1075 PAT Judge

题意:第一行输入学生个数 有多少个题目 所有同学提交的次数;然后输入每道题的满分是多少,用空格隔开,后面输入每一行就是某学生的学号,某一题的题号,还有该题的得分;

输出:根据先总分从大到小排,总分相同就比ac个数从大到小排,ac个数相同再比学号,从小到大排,提交没通过编译器的得分为-1,如果所有题目都没有提交过或者提交了都没过编译器都不会出现在排名里面,如果某一题提交过没通过编译器,输出的时候就是' 0',如果是没提交过就是:'-',某题目的最后得分是要多次提交中最大的那个。

思路:建一个结构体存各类数据(vectorscore(k+1)来存放学生的各个题目的得分,bool一个变量判断有没有得分),录入每个学生的数据 (v[id],根据id输入,已到达多条数据可以根据输入的id来输入到同一个学生身上,而不是v[i]),算出总分和ac个数,根据bool cmp,sort排序,然后就是排名,根据是true还是false,输出;

1.录入2.算数据3.排序4.输出;

收获:vector(int)score是长度为1的整型矢量,不能用scanf连续输入,scanf不能让vector自动增长,只能用push_back,而vector(int)score(n),是n个整形矢量,其长度也为1,可以把一个vector看成数组的一个单位用,或者再某一个vector后面push_back当作矩阵用,所以这题vector(int)score,就是长度为1的vector,就要有resize给他分配大小,scanf不能自动增加vector的大小;

代码:

#include
#include
#include
using namespace std;
struct student{
	int rank;
	int totalscore=0;
	vector score;
	int id;
	int ac=0;
	bool pass=false; 
};
bool cmp(student a,student b){
	if(a.totalscore!=b.totalscore){
		return a.totalscore>b.totalscore;
	} else if(a.ac!=b.ac){
		return a.ac>b.ac;
	}else {
		return a.id v(n+1);
	for(int i=1;i<=n;i++){//此时score是长度为1的矢量,scanf输入到vector里面是不会让vector自动增加长度的,要用push_back,所以要用resize来定义score的长度,并初始化为-1; 
		v[i].score.resize(m+1,-1);//如果没有这一步,下面for循环输入v[i].score就会报错 vectorscore就是一个长度为1的矢量, vectorscore(n)就是n个长度为1的矢量,可以在某个矢量根据下标push_back就是矩阵; 
	}
	vectorfullmark(m+1);
	for(int i=1;i<=m;i++){
		scanf("%d",&fullmark[i]);
	}
	for(int i=1;i<=k;i++){
		scanf("%d %d %d",&id,&num,&score);
		v[id].id=id;
		v[id].score[num]=max(v[id].score[num],score);
		if(score!=-1){
		v[id].pass=true;
	}
	if(v[id].score[num]==-1){
		v[id].score[num]=0;
	}
}
for(int i=1;i<=n;i++){
	for(int j=1;j<=m;j++){
		if(v[i].score[j]!=-1&&v[i].score[j]!=0){
			v[i].totalscore+=v[i].score[j];
		}
		if(v[i].score[j]==fullmark[j]){
			v[i].ac++;
		}
	}
} 
sort(v.begin()+1,v.end(),cmp);
for(int i=1;i<=n;i++){
	v[i].rank=i;
	if(i!=1&&v[i-1].totalscore==v[i].totalscore){
		v[i].rank=v[i-1].rank;
	}
}
			for(int i=1;i<=n;i++){
				if(v[i].pass==true){
					printf("%d %05d %d",v[i].rank,v[i].id,v[i].totalscore);
				for(int j=1;j<=m;j++){
				if(v[i].score[j]==-1){
					printf(" -");
					}else {
				printf(" %d",v[i].score[j]);
				}
			}
			printf("\n");
		}
	}
return 0;
}

你可能感兴趣的:(pat,算法,c++)