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 }

 

posted on 2018-01-04 10:14  么么打123  阅读(288)  评论(0编辑  收藏  举报