关于PAT A1075测试点4,通过我的测试,发现出错点有以下:
有些人闲的dan疼,已经获得满分他还要再输入一遍,这时要防止重复计算了完美解题数,对于我的代码修改如下:
原:
if(score==full[Pid]){ //如果这一得分等于对应题目的满分
stu[Uid].perfect++;
}
if(score>stu[Uid].point[Pid]){ //如果新提交的题目比之前的分高,则替换
stu[Uid].allPoint=stu[Uid].allPoint+score-stu[Uid].point[Pid]; //计算学生总分 加上前后之差
stu[Uid].point[Pid]=score; //这个学生这道题的得分修正
}
应该只有满足当新输入成绩比之前成绩高时才判断是否完美解决,以避免重复,改为
if(score>stu[Uid].point[Pid]){ //如果新提交的题目比之前的分高,则替换
stu[Uid].allPoint=stu[Uid].allPoint+score-stu[Uid].point[Pid]; //计算学生总分 加上前后之差
stu[Uid].point[Pid]=score; //这个学生这道题的得分
if(stu[Uid].point[Pid]==full[Pid]){
stu[Uid].perfect++;
}
}
然而很遗憾,我做了这样修改后还是出错,后来发现测试点4还有一个隐藏边界情况,就是当一个人有编译过了但只得了0分,即他总分就是0分,这时候也要输出!
对于我的代码,我用了结构体中的(int)stu.flag来表示是否要输出,只需要在cmp判断中首先加上判断flag大的优先,在最后输出遍历过程中当flag等于0时候break循环结束输出就可。
经过以上两处的修改,问题解决。