PAT A1075 20200119
第一次使用csdn,开始记录PAT刷题
类型:排序题目
注意点:读题一定要仔细,排序的时候,理清楚排序的先后
首先就是学生数据的初始化,需要对学生的学号和相关的信息进行初始化,不可以一边输入,一遍初始化。不然会一部分学生的信息不存在。
其次,就是学生多次提交的问题,只记录最高分,因此可能多次提交完美答案,因此需要输入完毕之后,计算有几个完美解答的题目。
最后,有关输出不显示的问题,不显示的是没有提交能够通过编译的学生或者根本没有提交解答的学生,需要注意的是记录中0和-1的区别。
最最关键的是 最后所有都考虑在内的时候,还有一个没有注意到,就是在一个记录输入为-1的时候,没有判断之前的成绩是否为-1,又改了原来的成绩。
#include<iostream>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<map>
#include<cstring>
using namespace std;
typedef struct{
int num,sum=0,perfectNum=0,rank,flag=0;
int score[6]={-1,-1,-1,-1,-1,-1};//5个题目
}Stu;
bool cmp(Stu a,Stu b){
if(a.flag!=b.flag)
return a.flag>b.flag;
else if(a.sum!=b.sum)
return a.sum>b.sum;
else if(a.perfectNum!=b.perfectNum)
return a.perfectNum>b.perfectNum;
else
return a.num<b.num;
}
int main(){
int N,K,M;
cin>>N>>K>>M;
Stu student[N+1];
int proScore[K+1];
for(int i=1;i<K+1;i++)
cin>>proScore[i];
int stunum,pronum,score;
for(int i=1;i<N+1;i++){
student[i].num=i;
}
for(int i=0;i<M;i++){
cin>>stunum>>pronum>>score;
if(student[stunum].score[pronum]<score){
student[stunum].flag=1;
student[stunum].score[pronum]=score;
}
if(score==-1&&student[stunum].score[pronum]==-1){//这个是重点 &&后面的
student[stunum].score[pronum]=0;
}
}
for(int i=1;i<N+1;i++){
int scoreSum=0;
for(int j=1;j<=K;j++){
if(student[i].score[j]!=0&&student[i].score[j]!=-1)
scoreSum+=student[i].score[j];
if(student[i].score[j]==proScore[j])
student[i].perfectNum++;
}
student[i].sum=scoreSum;
}
sort(student+1,student+N+1,cmp);
student[1].rank=1;
for(int i=2;i<N+1;i++){
student[i].rank=i;
if(student[i].sum==student[i-1].sum)
student[i].rank=student[i-1].rank;
}
for(int i=1;i<N+1;i++){
if(student[i].flag==0)
break;
printf("%d %05d %d ",student[i].rank,student[i].num,student[i].sum);
for(int j=1;j<K+1;j++){
if(student[i].score[j]==-1)
cout<<"-";
else
cout<<student[i].score[j];
if(j!=K)
cout<<" ";
}
cout<<endl;
}
return 0;
}
来源:CSDN
作者:weixin_42302528
链接:https://blog.csdn.net/weixin_42302528/article/details/104046057