学生互评作业的简单规则是这样定的:每个人的作业会被k
个同学评审,得到k
个成绩。系统需要去掉一个最高分和一个最低分,将剩下的分数取平均,就得到这个学生的最后成绩。本题就要求你编写这个互评系统的算分模块。
输入格式:
输入第一行给出3个正整数N
(3 < N
≤104,学生总数)、k
(3 ≤ k
≤ 10,每份作业的评审数)、M
(≤ 20,需要输出的学生数)。随后N
行,每行给出一份作业得到的k
个评审成绩(在区间[0, 100]内),其间以空格分隔。
输出格式:
按非递减顺序输出最后得分最高的M
个成绩,保留小数点后3位。分数间有1个空格,行首尾不得有多余空格。
输入样例:
在这里给出一组输入。例如:
1 2 3 4 5 6 7
| 6 5 3 88 90 85 99 60 67 60 80 76 70 90 93 96 99 99 78 65 77 70 72 88 88 88 88 88 55 55 55 55 55
|
输出样例:
在这里给出相应的输出。例如:
思路
每次读入一组数据,数组存入后自动排序,并去掉最大值和最小值,直接将结果存入最终的结果数组中。注意最后输出时需要将前k名,升序输出。
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| #include <iostream> #include <algorithm> #include <vector> using namespace std; int main(){ int n, m, k; vector <double> pos; scanf("%d %d %d",&n,&k,&m); for(int i = 0; i < n; i ++){ int x; vector <int> v; for(int j = 0; j < k; j ++){ scanf("%d",&x); v.push_back(x); } sort(v.begin(),v.end()); double sum = 0; for(int h = 1; h < v.size() - 1; h ++){ sum += v[h]; } pos.push_back(sum / (k - 2)); } sort(pos.begin(),pos.end()); int isfir = 1; for(int i = n - m; i < n; i ++){ if(!isfir) cout<<" "; isfir = 0; printf("%.3f",pos[i]); } return 0; }
|