PAT 乙级 1077 互评成绩计算 (20)
在浙大的计算机专业课中,经常有互评分组报告这个环节。一个组上台介绍自己的工作,其他组在台下为其表现评分。最后这个组的互评成绩是这样计算的:所有其他组的评分中,去掉一个最高分和一个最低分,剩下的分数取平均分记为 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 3 using namespace std; 4 5 int main() 6 { 7 int n, full_grade; 8 9 cin >> n >> full_grade; 10 11 int* p = new int[n*n]; 12 int *min = new int[n];//最小成绩的下标 13 int *max = new int[n];//最大成绩的下标 14 int *grade = new int[n];//计算学生合法成绩总和 15 int *num = new int[n];//合法成绩数 16 17 for (int i = 0; i < n; ++i) 18 { 19 num[i] = -3;//老师输入合法但不包括,最大最小不包括 20 grade[i] = 0; 21 } 22 23 for (int i = 0; i < n; ++i) 24 { 25 int Min = INT_MAX, Max = INT_MIN; 26 27 for (int j = 0; j < n; ++j) 28 { 29 cin >> *(p + n*i + j); 30 31 if (*(p + n*i + j) <= full_grade && *(p + n*i + j) >= 0)//输入合法 32 { 33 if (*(p + n*i + j) > Max && j)//得到最大值 34 { 35 max[i] = j; 36 Max = *(p + n*i + j); 37 } 38 39 if (*(p + n*i + j) < Min && j)//得到最小值 40 { 41 min[i] = j; 42 Min = *(p + n*i + j); 43 } 44 45 num[i]++;//累加合法个数 46 } 47 else 48 *(p + n*i + j) = 0;//方便计算,省去后续继续判断越界 49 } 50 } 51 52 for (int i = 0; i < n; ++i) 53 { 54 for (int j = 1; j < n; ++j) 55 if (j != min[i] && j != max[i]) 56 grade[i] += *(p + n*i + j); 57 58 cout << (int)(((grade[i] / num[i]) + (*(p + n*i))) / 2.0 + 0.5) << endl;; 59 } 60 61 delete[] p; 62 delete[] min; 63 delete[] max; 64 delete[] grade; 65 delete[] num; 66 return 0; 67 }