PAT乙级题库“傻瓜”题解之互评成绩
在浙大的计算机专业课中,经常有互评分组报告这个环节。一个组上台介绍自己的工作,其他组在台下为其表现评分。最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 G1;老师给这个组的评分记为 G2。该组得分为 (G1+G2)/2,最后结果四舍五入后保留整数分。本题就要求你写个程序帮助老师计算每个组的互评成绩。
输入格式:
输入第一行给出两个正整数 N(> 3)和 M,分别是分组数和满分,均不超过 100。随后 N 行,每行给出该组得到的 N 个分数(均保证为整型范围内的整数),其中第 1 个是老师给出的评分,后面 N−1 个是其他组给的评分。合法的输入应该是 [0,M] 区间内的整数,若不在合法区间内,则该分数须被忽略。题目保证老师的评分都是合法的,并且每个组至少会有 3 个来自同学的合法评分。
输出格式:
为每个组输出其最终得分。每个得分占一行。
输入样例:
6 50
42 49 49 35 38 41
36 51 50 28 -1 30
40 36 41 33 47 49
30 250 -25 27 45 31
48 0 0 50 50 1234
43 41 36 29 42 29
输出样例:
42
33
41
31
37
39
1 #include<iostream> 2 #include<cmath> 3 using namespace std; 4 int main() 5 { 6 int n,m; 7 cin>>n>>m; 8 struct scores{ 9 int G1; 10 int G2[200]; 11 int k; 12 double average; 13 }; 14 scores scos[n]; 15 for(int i=0;i<n;i++) 16 { 17 scos[i].k=0; 18 cin>>scos[i].G1; 19 for(int j=0;j<n-1;j++) 20 { 21 22 int x; 23 cin>>x; 24 if(x>=0&&x<=m)//判断学生评分是否为合理数据 25 { 26 scos[i].G2[scos[i].k]=x; 27 scos[i].k++; 28 } 29 } 30 } 31 32 for(int p=0;p<n;p++) 33 for(int i=0;i<scos[p].k;i++) 34 { 35 for(int j=i+1;j<scos[p].k;j++) 36 if(scos[p].G2[i]>scos[p].G2[j]) 37 { 38 int min=scos[p].G2[j]; 39 scos[p].G2[j]=scos[p].G2[i]; 40 scos[p].G2[i]=min; 41 } 42 } 43 for(int i=0;i<n;i++) 44 { 45 if(scos[i].k-2==0) scos[i].average=0; 46 else if(scos[i].k-2==1) scos[i].average=scos[i].G2[1]; 47 else{ 48 for(int j=1;j<scos[i].k-1;j++) 49 { 50 scos[i].average+=scos[i].G2[j]; 51 } 52 scos[i].average/=(scos[i].k-2); 53 } 54 scos[i].average= 55 round((scos[i].average+scos[i].G1)/2.0); 56 cout<<scos[i].average<<endl; 57 } 58 59 60 61 return 0; 62 }
这道题我还是用的结构体来做的,主要是卡在合理数据算平均算数的位置上,暴力解决的方法就是直接把去掉最高分和最低分后合理数据的个数拿出来单独讨论。